/ Hex Artifact Content
Login

Artifact 17ac3113571597edc8b75fd4f890851274cd2581759d611c80dd6b19972e3b4e:


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: 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
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 2c 20 77   hits, misses, w
8630: 72 69 74 65 73 2c 20 73 70 69 6c 6c 73 20 2a 2f  rites, spills */
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8650: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
8680: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
8690: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
86a0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
86b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
86c0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
86d0: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
86e0: 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65  int (*xGet)(Page
86f0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
8700: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8710: 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74  e to fetch a pat
8720: 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ch */.#ifdef SQL
8730: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8740: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8750: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8760: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8770: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8780: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8790: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
87a0: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
87b0: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87c0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87d0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87e0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8800: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
8810: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8820: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8840: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8850: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8860: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8870: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8890: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
88a0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
88b0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88c0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88e0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
8900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8910: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8940: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8950: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8960: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8990: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
89a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
89b0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89c0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89d0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89e0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
8a00: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a10: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a20: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a30: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a40: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a50: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a60: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a80: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a90: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8aa0: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8ab0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ac0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ad0: 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f 2a 0a  TAT_SPILL 3../*.
8ae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8af0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8b00: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8b10: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b20: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b30: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b40: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b50: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b60: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8ba0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8bb0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8bc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8be0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8c10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c30: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c40: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c50: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c90: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8ca0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8cb0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8cc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cd0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8ce0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cf0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8d00: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8d10: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d20: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d30: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d40: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d50: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d60: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d70: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8da0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8db0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8dc0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8dd0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8df0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8e00: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8e10: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e20: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e40: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e50: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e60: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e70: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8ea0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8eb0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ec0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8ed0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ee0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ef0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8f00: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8f10: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f30: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f50: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f60: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f70: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f80: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f90: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8fa0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8fb0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fc0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fe0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8ff0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
9000: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
9010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9020: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9040: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9050: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9060: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9070: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9080: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9090: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
90a0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
90b0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90d0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90e0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90f0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
9100: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
9110: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9120: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9130: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9140: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9150: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9160: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9170: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9180: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9190: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
91a0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
91b0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91c0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91d0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91e0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
9200: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
9210: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9220: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9230: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9240: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9260: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9270: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9290: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
9300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
9310: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9320: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9330: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9340: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9350: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9360: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9370: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9380: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9390: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
93a0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
93b0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93c0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93f0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
9400: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
9410: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9420: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9430: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9450: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9460: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9470: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9480: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9490: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
94a0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
94b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94d0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94f0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9520: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9530: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9540: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9550: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9560: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9570: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9580: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9590: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
95a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
95b0: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95c0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95d0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95e0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95f0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
9600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
9610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9650: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9660: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9670: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9690: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
96a0: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
96b0: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96c0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96d0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96e0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96f0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
9700: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
9710: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9720: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9730: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9740: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9750: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9760: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9770: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9780: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9790: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
97a0: 68 6f 64 73 21 3d 30 29 0a 0a 23 69 66 64 65 66  hods!=0)..#ifdef
97b0: 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
97c0: 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 2f 2a 0a  VERFLOW_READ./*.
97d0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
97e0: 66 20 70 61 67 65 20 70 67 6e 6f 20 63 61 6e 20  f page pgno can 
97f0: 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
9800: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
9810: 73 65 20 66 69 6c 65 0a 2a 2a 20 62 79 20 74 68  se file.** by th
9820: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2e 20  e b-tree layer. 
9830: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  This is the case
9840: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   if:.**.**   * t
9850: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9860: 20 69 73 20 6f 70 65 6e 2c 0a 2a 2a 20 20 20 2a   is open,.**   *
9870: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
9880: 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
9890: 20 63 61 63 68 65 2c 20 61 6e 64 0a 2a 2a 20 20   cache, and.**  
98a0: 20 2a 20 74 68 65 20 64 65 73 69 72 65 64 20 70   * the desired p
98b0: 61 67 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  age is not curre
98c0: 6e 74 6c 79 20 69 6e 20 74 68 65 20 77 61 6c 20  ntly in the wal 
98d0: 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  file..*/.int sql
98e0: 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74 52  ite3PagerDirectR
98f0: 65 61 64 4f 6b 28 50 61 67 65 72 20 2a 70 50 61  eadOk(Pager *pPa
9900: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
9910: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
9920: 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 29  d->pMethods==0 )
9930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
9940: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 49 73   sqlite3PCacheIs
9950: 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
9960: 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 20  Cache) ) return 
9970: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
9980: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
9990: 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 21   pPager->xCodec!
99a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  =0 ) return 0;.#
99b0: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
99c0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
99d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
99e0: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 52 65 61   ){.    u32 iRea
99f0: 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  d = 0;.    int r
9a00: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
9a10: 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
9a20: 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
9a30: 6e 6f 2c 20 26 69 52 65 61 64 29 3b 0a 20 20 20  no, &iRead);.   
9a40: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
9a50: 49 54 45 5f 4f 4b 20 26 26 20 69 52 65 61 64 3d  ITE_OK && iRead=
9a60: 3d 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  =0);.  }.#endif.
9a70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
9a80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
9a90: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20  LITE_OMIT_WAL.# 
9aa0: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9ab0: 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61 6c  al(x) ((x)->pWal
9ac0: 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0).#else.# def
9ad0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
9ae0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
9af0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
9b00: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9b10: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
9b20: 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20  x,y) 0.# define 
9b30: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9b40: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9b50: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9b60: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
9b70: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
9b80: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
9b90: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
9ba0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
9bb0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
9bc0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
9bd0: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
9be0: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
9bf0: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
9c00: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9c10: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9c20: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9c30: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9c40: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9c50: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9c60: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9c70: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
9c80: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
9c90: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
9ca0: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
9cb0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
9cc0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
9cd0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9ce0: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
9cf0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9d00: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9d10: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9d20: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9d30: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9d40: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9d50: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9d60: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
9d70: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9d80: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
9d90: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9da0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
9db0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
9dc0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
9dd0: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
9de0: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
9df0: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
9e00: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9e10: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9e20: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9e30: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9e40: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9e50: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9e60: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
9e70: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
9e80: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
9e90: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
9ea0: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
9eb0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
9ec0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
9ed0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9ee0: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
9ef0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
9f00: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9f10: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9f20: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9f30: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9f40: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9f50: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9f60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9f70: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
9f80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9f90: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
9fa0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9fb0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9fc0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9fd0: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
9fe0: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
9ff0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
a000: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
a010: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
a020: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
a030: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
a040: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
a050: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
a060: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
a070: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
a080: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
a090: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
a0a0: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
a0b0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
a0c0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
a0d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
a0e0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
a0f0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
a100: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
a110: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
a120: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
a130: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
a140: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
a150: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
a160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a170: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
a180: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a190: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
a1a0: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
a1b0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
a1c0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
a1d0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
a1e0: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
a1f0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
a200: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
a210: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
a220: 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a  sOpen(p->fd) );.
a230: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
a240: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
a250: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
a260: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a270: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a280: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a290: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a2a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
a2b0: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
a2c0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
a2d0: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
a2e0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
a2f0: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
a300: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
a310: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
a320: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
a330: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
a340: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
a350: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
a360: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
a370: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
a380: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
a390: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
a3a0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
a3b0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a3c0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
a3d0: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
a3e0: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
a3f0: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
a400: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a410: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
a420: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
a430: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a440: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a450: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a460: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a470: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a480: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
a490: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
a4a0: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
a4b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a4c0: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
a4d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a4e0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a4f0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a500: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a510: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a520: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a530: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
a540: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
a550: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a560: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
a570: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
a580: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a590: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a5a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a5b0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a5c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a5d0: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a5e0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a5f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a600: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a610: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
a620: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a630: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
a640: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
a650: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a660: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a670: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a680: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a690: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a6a0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a6b0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a6c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a6d0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a6e0: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a6f0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a700: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a710: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a720: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a730: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a740: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a750: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a760: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a770: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a780: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a790: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a7a0: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a7b0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a7c0: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a7d0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a7e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a7f0: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a800: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a810: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a820: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a830: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a840: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a850: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a860: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a870: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a880: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a890: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a8a0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a8b0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a8c0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a8d0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a8e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a8f0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a900: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a910: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a920: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a930: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a940: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b  _WAL .        );
a950: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a960: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a970: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a980: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b  r->dbFileSize );
a990: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a9a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a9b0: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e==pPager->dbHin
a9c0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a9d0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a9e0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
a9f0: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
aa00: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
aa10: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
aa20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
aa30: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
aa40: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
aa50: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
aa60: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
aa70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
aa80: 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56  >eLock>=EXCLUSIV
aa90: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
aaa0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
aab0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
aac0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
aad0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aae0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
aaf0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
ab00: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ab10: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
ab20: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
ab30: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
ab40: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ab50: 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  p->fd)&SQLITE_IO
ab60: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
ab70: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
ab80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ab90: 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61  >dbOrigSize<=pPa
aba0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
abb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
abc0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
abd0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a  WRITER_FINISHED:
abe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
abf0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
ac00: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
ac10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ac20: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
ac30: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
ac40: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
ac50: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
ac60: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
ac70: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
ac80: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
ac90: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aca0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
acb0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
acc0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
acd0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ace0: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20  WAL .           
acf0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
ad00: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
ad10: 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45  cs(p->fd)&SQLITE
ad20: 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f  _IOCAP_BATCH_ATO
ad30: 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  MIC).      );.  
ad40: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
ad50: 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52  case PAGER_ERROR
ad60: 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  :.      /* There
ad70: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
ad80: 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
ad90: 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  g reference to t
ada0: 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20  he pager if.    
adb0: 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74    ** in ERROR st
adc0: 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ate. Otherwise t
add0: 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
ade0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f  have already dro
adf0: 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  pped.      ** ba
ae00: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
ae10: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ae20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ae30: 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
ae40: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
ae50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
ae60: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
ae70: 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c  r->pPCache)>0 ||
ae80: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
ae90: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
aea0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
aeb0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  1;.}.#endif /* i
aec0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a  fndef NDEBUG */.
aed0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aee0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75  EBUG ./*.** Retu
aef0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
af00: 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
af10: 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61   string in a sta
af20: 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f  tic buffer.** co
af30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61  ntaining the sta
af40: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
af50: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
af60: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68   an argument. Th
af70: 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65  is.** is intende
af80: 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  d to be used wit
af90: 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46  hin debuggers. F
afa0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61  or example, as a
afb0: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  n alternative.**
afc0: 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67   to "print *pPag
afd0: 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a  er" in gdb:.**.*
afe0: 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22  * (gdb) printf "
aff0: 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72  %s", print_pager
b000: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a  _state(pPager).*
b010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b020: 65 20 68 61 73 20 65 78 74 65 72 6e 61 6c 20 6c  e has external l
b030: 69 6e 6b 61 67 65 20 69 6e 20 6f 72 64 65 72 20  inkage in order 
b040: 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d 70  to suppress comp
b050: 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a 2a 2a  iler warnings.**
b060: 20 61 62 6f 75 74 20 61 6e 20 75 6e 75 73 65 64   about an unused
b070: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 69   function.  It i
b080: 73 20 65 6e 63 6c 6f 73 65 64 20 77 69 74 68 69  s enclosed withi
b090: 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  n SQLITE_DEBUG a
b0a0: 6e 64 20 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e 6f  nd so does.** no
b0b0: 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
b0c0: 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63 68  al builds..*/.ch
b0d0: 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f  ar *print_pager_
b0e0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
b0f0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
b100: 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71  Ret[1024];..  sq
b110: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
b120: 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20  024, zRet,.     
b130: 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20   "Filename:     
b140: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74   %s\n".      "St
b150: 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20  ate:         %s 
b160: 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20  errCode=%d\n".  
b170: 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20      "Lock:      
b180: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
b190: 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20  "Locking mode:  
b1a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c  locking_mode=%s\
b1b0: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
b1c0: 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c  l mode:  journal
b1d0: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
b1e0: 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65    "Backing store
b1f0: 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65  : tempFile=%d me
b200: 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61  mDb=%d useJourna
b210: 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a  l=%d\n".      "J
b220: 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f  ournal:       jo
b230: 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f  urnalOff=%lld jo
b240: 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22  urnalHdr=%lld\n"
b250: 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20  .      "Size:   
b260: 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64         dbsize=%d
b270: 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64   dbOrigSize=%d d
b280: 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a  bFileSize=%d\n".
b290: 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65        , p->zFile
b2a0: 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  name.      , p->
b2b0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
b2c0: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20  EN            ? 
b2d0: 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20  "OPEN" :.       
b2e0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b2f0: 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20  R_READER        
b300: 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20    ? "READER" :. 
b310: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
b320: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
b330: 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45  OCKED   ? "WRITE
b340: 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20  R_LOCKED" :.    
b350: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b360: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
b370: 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43  EMOD ? "WRITER_C
b380: 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20  ACHEMOD" :.     
b390: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b3a0: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
b3b0: 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42      ? "WRITER_DB
b3c0: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b3d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b3e0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
b3f0: 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ? "WRITER_FINISH
b400: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
b410: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
b420: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f  RROR           ?
b430: 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72   "ERROR" : "?err
b440: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
b450: 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  t)p->errCode.   
b460: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
b470: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
b480: 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20   "NO_LOCK" :.   
b490: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52       p->eLock==R
b4a0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f  ESERVED_LOCK   ?
b4b0: 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20   "RESERVED" :.  
b4c0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b4d0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
b4e0: 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a  ? "EXCLUSIVE" :.
b4f0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
b500: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  ==SHARED_LOCK   
b510: 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20    ? "SHARED" :. 
b520: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b530: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20  =UNKNOWN_LOCK   
b540: 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22   ? "UNKNOWN" : "
b550: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
b560: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
b570: 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20  e ? "exclusive" 
b580: 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20  : "normal".     
b590: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64   , p->journalMod
b5a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b5b0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20  MODE_MEMORY   ? 
b5c0: 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20  "memory" :.     
b5d0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b5e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b5f0: 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20  MODE_OFF      ? 
b600: 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20  "off" :.        
b610: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b620: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b630: 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65  E_DELETE   ? "de
b640: 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  lete" :.        
b650: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b660: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b670: 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65  E_PERSIST  ? "pe
b680: 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20  rsist" :.       
b690: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b6a0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b6b0: 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74  DE_TRUNCATE ? "t
b6c0: 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20  runcate" :.     
b6d0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b6e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b6f0: 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20  MODE_WAL      ? 
b700: 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f  "wal" : "?error?
b710: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b720: 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74  ->tempFile, (int
b730: 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29  )p->memDb, (int)
b740: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  p->useJournal.  
b750: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
b760: 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48  Off, p->journalH
b770: 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  dr.      , (int)
b780: 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29  p->dbSize, (int)
b790: 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28  p->dbOrigSize, (
b7a0: 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a  int)p->dbFileSiz
b7b0: 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e.  );..  return
b7c0: 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
b7d0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
b7e0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76 61  rences to the va
b7f0: 72 69 6f 75 73 20 70 61 67 65 20 67 65 74 74 65  rious page gette
b800: 72 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  rs */.static int
b810: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50   getPageNormal(P
b820: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b830: 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63  e**,int);.static
b840: 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f   int getPageErro
b850: 72 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62  r(Pager*,Pgno,Db
b860: 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66  Page**,int);.#if
b870: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b880: 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
b890: 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 50  nt getPageMMap(P
b8a0: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b8b0: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66  e**,int);.#endif
b8c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b8d0: 50 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68 6f  Pager.xGet metho
b8e0: 64 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f 70  d for the approp
b8f0: 72 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75 73  riate routine us
b900: 65 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63  ed to fetch.** c
b910: 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
b920: 70 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pager..*/.static
b930: 20 76 6f 69 64 20 73 65 74 47 65 74 74 65 72 4d   void setGetterM
b940: 65 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50 61  ethod(Pager *pPa
b950: 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
b960: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
b970: 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20     pPager->xGet 
b980: 3d 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b 0a  = getPageError;.
b990: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
b9a0: 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c  MAP_SIZE>0.  }el
b9b0: 73 65 20 69 66 28 20 55 53 45 46 45 54 43 48 28  se if( USEFETCH(
b9c0: 70 50 61 67 65 72 29 0a 23 69 66 64 65 66 20 53  pPager).#ifdef S
b9d0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
b9e0: 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43     && pPager->xC
b9f0: 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20  odec==0.#endif. 
ba00: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ba10: 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d 4d  xGet = getPageMM
ba20: 61 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ap;.#endif /* SQ
ba30: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
ba40: 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  ZE>0 */.  }else{
ba50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
ba60: 74 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d 61  t = getPageNorma
ba70: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
ba80: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
ba90: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
baa0: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
bab0: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
bac0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
bad0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
bae0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
baf0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
bb00: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
bb10: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
bb20: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
bb30: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
bb40: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
bb50: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
bb60: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
bb70: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
bb80: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
bb90: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
bba0: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
bbb0: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
bbc0: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
bbd0: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
bbe0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
bbf0: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
bc00: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
bc10: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
bc20: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
bc30: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
bc40: 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  *p;.  Pgno pgno 
bc50: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69  = pPg->pgno;.  i
bc60: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
bc70: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
bc80: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
bc90: 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53   p = &pPager->aS
bca0: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
bcb0: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
bcc0: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
bcd0: 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75  3BitvecTestNotNu
bce0: 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  ll(p->pInSavepoi
bcf0: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
bd00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
bd10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bd20: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
bd30: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
bd40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
bd50: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
bd60: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
bd70: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
bd80: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
bd90: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
bda0: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
bdb0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
bdc0: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
bdd0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
bde0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e  Pg->pgno);.}.#en
bdf0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
be00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
be10: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
be20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
be30: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
be40: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
be50: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
be60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
be70: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
be80: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
be90: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
bea0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
beb0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
bec0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
bed0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
bee0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
bef0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
bf00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
bf10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
bf20: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
bf30: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
bf40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
bf50: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
bf60: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
bf70: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
bf80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bf90: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
bfa0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
bfb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bfc0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
bfd0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
bfe0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
bff0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
c000: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
c010: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
c020: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
c030: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
c040: 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  B).../*.** Write
c050: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
c060: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
c070: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c080: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
c090: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
c0a0: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
c0b0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
c0c0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
c0d0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
c0e0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
c0f0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
c100: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
c110: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
c120: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
c130: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
c140: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
c150: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
c160: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
c170: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c180: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c190: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c1a0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20  ther NO_LOCK.** 
c1b0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20  or SHARED_LOCK. 
c1c0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
c1d0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
c1e0: 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b   call to xUnlock
c1f0: 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20  ().** succeeds, 
c200: 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c  set the Pager.eL
c210: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
c220: 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d  match the (attem
c230: 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a  pted) new lock..
c240: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
c250: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
c260: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
c270: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
c280: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
c290: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
c2a0: 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63  fy it. See the c
c2b0: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
c2c0: 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20   #define of .** 
c2d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
c2e0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
c2f0: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
c300: 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f  ic int pagerUnlo
c310: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c320: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c330: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c340: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c350: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c360: 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
c370: 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20  r->eLock==eLock 
c380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
c390: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck==NO_LOCK || e
c3a0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c3b0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
c3c0: 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock!=NO_LOCK ||
c3d0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
c3e0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ger)==0 );.  if(
c3f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c400: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
c410: 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
c420: 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72  >=eLock );.    r
c430: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
c440: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
c450: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
c460: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c470: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ck);.    if( pPa
c480: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
c490: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
c4a0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c4b0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c4c0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
c4d0: 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  "UNLOCK %p %d\n"
c4e0: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
c4f0: 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ).  }.  return r
c500: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
c510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c520: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
c530: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
c540: 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c   either SHARED_L
c550: 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44  OCK,.** RESERVED
c560: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
c570: 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20  VE_LOCK. If the 
c580: 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73  caller is succes
c590: 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a  sful, set the.**
c5a0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
c5b0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77  iable to the new
c5c0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20   locking state. 
c5d0: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
c5e0: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
c5f0: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
c600: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
c610: 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63  unction is .** c
c620: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
c630: 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74  dify it unless t
c640: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
c650: 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56  tate is EXCLUSIV
c660: 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20  E_LOCK. .** See 
c670: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
c680: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
c690: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
c6a0: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
c6b0: 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f   .** of this..*/
c6c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c6d0: 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  rLockDb(Pager *p
c6e0: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
c6f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c700: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
c710: 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  rt( eLock==SHARE
c720: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
c730: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
c740: 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  | eLock==EXCLUSI
c750: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
c760: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65   pPager->eLock<e
c770: 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Lock || pPager->
c780: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
c790: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  OCK ){.    rc = 
c7a0: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c7b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c7c0: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
c7d0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
c7e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c7f0: 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d  E_OK && (pPager-
c800: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c810: 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43  LOCK||eLock==EXC
c820: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a  LUSIVE_LOCK) ){.
c830: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
c840: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
c850: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
c860: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
c870: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
c880: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c890: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c8a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
c8b0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
c8c0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
c8d0: 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61  ic-write or.** a
c8e0: 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74  tomic-batch-writ
c8f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
c900: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
c910: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
c920: 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  .** atomic-write
c930: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
c940: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
c950: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
c960: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
c970: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c980: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
c990: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
c9a0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
c9b0: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
c9c0: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
c9d0: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
c9e0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
c9f0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
ca00: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
ca10: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
ca20: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
ca30: 2a 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  * If it can be u
ca40: 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  sed, then the va
ca50: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
ca60: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
ca70: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
ca80: 20 77 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e   when it contain
ca90: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
caa0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
cab0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
cac0: 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69  atomic-batch-wri
cad0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
cae0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 4f  can be used if O
caf0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
cb00: 69 73 74 69 63 73 28 29 0a 2a 2a 20 72 65 74 75  istics().** retu
cb10: 72 6e 73 20 61 20 76 61 6c 75 65 20 77 69 74 68  rns a value with
cb20: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
cb30: 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20 62  P_BATCH_ATOMIC b
cb40: 69 74 20 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a  it set. -1 is.**
cb50: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
cb60: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
cb70: 20 6e 65 69 74 68 65 72 20 6f 70 74 69 6d 69 7a   neither optimiz
cb80: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
cb90: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
cba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cbb0: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
cbc0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
cbd0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
cbe0: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
cbf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
cc00: 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c  OMIC_WRITE) \. |
cc10: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
cc20: 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
cc30: 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 69 6e  OMIC_WRITE).  in
cc40: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
cc70: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20  teristics */..  
cc80: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
cc90: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
cca0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
ccb0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
ccc0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
ccd0: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
cce0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 72  PARAMETER(pPager
ccf0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
cd00: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cd10: 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
cd20: 54 45 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  TE.  if( pPager-
cd30: 3e 64 62 53 69 7a 65 3e 30 20 26 26 20 28 64 63  >dbSize>0 && (dc
cd40: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
cd50: 54 43 48 5f 41 54 4f 4d 49 43 29 20 29 7b 0a 20  TCH_ATOMIC) ){. 
cd60: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
cd70: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
cd80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
cd90: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 7b 0a  TOMIC_WRITE.  {.
cda0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 20      int nSector 
cdb0: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
cdc0: 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
cdd0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
cde0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
cdf0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
ce00: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
ce10: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
ce20: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
ce30: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
ce40: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
ce50: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
ce60: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
ce70: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
ce80: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
ce90: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
cea0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
ceb0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
cec0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
ced0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
cee0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
cef0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cf00: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
cf10: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
cf20: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
cf30: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
cf40: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
cf50: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
cf60: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
cf70: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
cf80: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
cf90: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
cfa0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
cfb0: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
cfc0: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
cfd0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
cfe0: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
cff0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
d000: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
d010: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
d020: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
d030: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
d040: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
d050: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
d060: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
d070: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
d080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
d090: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
d0a0: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
d0b0: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
d0c0: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
d0d0: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
d0e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
d0f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
d100: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
d110: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
d120: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
d130: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
d140: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
d150: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
d160: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
d170: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
d180: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
d190: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
d1a0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
d1b0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
d1c0: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
d1d0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
d1e0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
d1f0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
d200: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
d210: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
d220: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
d230: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
d240: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
d250: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
d260: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
d270: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
d280: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
d290: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
d2a0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
d2b0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
d2c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
d2d0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
d2e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
d2f0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
d300: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
d310: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
d320: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
d330: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
d340: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
d350: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
d360: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
d370: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
d380: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
d390: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
d3a0: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
d3b0: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
d3c0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
d3d0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
d3e0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
d3f0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
d400: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
d410: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
d420: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
d430: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
d440: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d450: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
d460: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
d470: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
d480: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
d490: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
d4a0: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
d4b0: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
d4c0: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
d4d0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
d4e0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
d4f0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
d500: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d510: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
d520: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
d530: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
d540: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
d550: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
d560: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
d570: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
d580: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
d590: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
d5a0: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
d5b0: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
d5c0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
d5d0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
d5e0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
d5f0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
d600: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
d610: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
d620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
d630: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
d640: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
d650: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
d660: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
d670: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
d680: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
d690: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
d6a0: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
d6b0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
d6c0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
d6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
d6e0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
d6f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
d700: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
d710: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
d720: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
d730: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
d740: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
d750: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
d760: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
d770: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
d780: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
d790: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
d7a0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
d7b0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
d7c0: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
d7d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
d7e0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
d7f0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
d800: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
d810: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
d820: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d830: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
d840: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
d850: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
d860: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
d870: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
d880: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d890: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
d8a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
d8b0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
d8c0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
d8d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d900: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d920: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
d930: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
d940: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
d950: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
d960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
d970: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
d980: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
d990: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
d9a0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
d9b0: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
d9c0: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
d9d0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
d9e0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da00: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
da10: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
da20: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
da30: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
da40: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
da50: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
da60: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
da70: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
da80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
da90: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
daa0: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
dab0: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
dac0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
dad0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
dae0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
daf0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
db00: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a  er .   || len>sz
db10: 4a 2d 31 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d  J-16.   || len==
db20: 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  0 .   || SQLITE_
db30: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
db40: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
db50: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
db60: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
db70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
db80: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
db90: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
dba0: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
dbb0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
dbc0: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
dbd0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
dbe0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
dbf0: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
dc00: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
dc10: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dc20: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
dc30: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
dc40: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
dc50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
dc60: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
dc70: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
dc80: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
dc90: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
dca0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
dcb0: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
dcc0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
dcd0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
dce0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
dcf0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
dd00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dd10: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
dd20: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
dd30: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
dd40: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
dd50: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
dd60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
dd70: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
dd80: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
dd90: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
dda0: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
ddb0: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
ddc0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
ddd0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
dde0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
ddf0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
de00: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
de10: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
de20: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
de30: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
de40: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
de50: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
de60: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
de70: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
de80: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
de90: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
dea0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
deb0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
dec0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
ded0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
dee0: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
def0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df10: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
df80: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
df90: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
dfa0: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
dfb0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
dfc0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
dfd0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
dfe0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
dff0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
e000: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
e010: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
e020: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e030: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
e040: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e050: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
e060: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
e070: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
e080: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e090: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
e0a0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
e0b0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
e0c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
e0d0: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
e0e0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
e0f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
e100: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
e110: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
e120: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
e130: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
e140: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
e150: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
e160: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
e170: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
e180: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
e190: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
e1a0: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
e1b0: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
e1c0: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
e1d0: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
e1e0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
e1f0: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
e200: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
e210: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
e220: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
e230: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
e240: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
e250: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
e260: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
e270: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e280: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
e290: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
e2a0: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
e2b0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
e2c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e2d0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
e2e0: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
e2f0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
e300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
e310: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
e320: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
e330: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
e340: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
e350: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
e360: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
e370: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
e380: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
e390: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
e3a0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
e3b0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
e3c0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
e3d0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
e3e0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
e3f0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
e400: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
e410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
e420: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
e430: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
e440: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
e450: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
e460: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
e470: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
e480: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
e490: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
e4a0: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
e4b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e4c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e4d0: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
e4e0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
e4f0: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
e500: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e510: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
e540: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
e550: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
e560: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
e570: 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49  !sqlite3JournalI
e580: 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
e590: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
e5a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e5b0: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
e5c0: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
e5d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
e5e0: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
e5f0: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
e600: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
e610: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
e620: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
e630: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
e640: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
e650: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e660: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
e670: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
e680: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
e690: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
e6a0: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
e6b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e6c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
e6d0: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
e6e0: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
e6f0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
e700: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e710: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
e720: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
e730: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
e740: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
e750: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
e760: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
e770: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
e780: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
e790: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
e7a0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
e7b0: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
e7c0: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
e7d0: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
e7e0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
e7f0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
e800: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
e810: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
e820: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
e830: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
e840: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
e850: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
e860: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
e870: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
e880: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
e890: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
e8a0: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
e8b0: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
e8c0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
e8d0: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
e8e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e8f0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
e900: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
e910: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e920: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e930: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
e940: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
e950: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
e960: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
e970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e980: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e990: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
e9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e9b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e9c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
e9d0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
e9e0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
e9f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
ea00: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
ea10: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
ea20: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
ea30: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
ea40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
ea50: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
ea60: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
ea70: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
ea80: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
ea90: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
eaa0: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
eab0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
eac0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
ead0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
eae0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
eaf0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
eb00: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
eb10: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
eb20: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
eb30: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
eb40: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
eb50: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
eb60: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
eb70: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
eb80: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
eb90: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
eba0: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
ebb0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
ebc0: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
ebd0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
ebe0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
ebf0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
ec00: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
ec10: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
ec20: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
ec30: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
ec40: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
ec50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ec70: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ec80: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
ec90: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
eca0: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
ecb0: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
ecc0: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
ecd0: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
ece0: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
ecf0: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
ed00: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
ed10: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
ed20: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
ed50: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
ed60: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
ed70: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
eda0: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
edb0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
edc0: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
edd0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
ede0: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
edf0: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
ee00: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ee10: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
ee20: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
ee30: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ee40: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ee50: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
ee60: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
ee70: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
ee80: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
ee90: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
eea0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
eeb0: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
eec0: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
eed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
eee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
eef0: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
ef00: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
ef10: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
ef20: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
ef30: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
ef40: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
ef50: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
ef60: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
ef70: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
ef80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
ef90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
efa0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
efb0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
efc0: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
efd0: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
efe0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
eff0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
f000: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
f010: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
f020: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
f030: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
f040: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
f050: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
f060: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
f070: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
f080: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
f090: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
f0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
f0b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
f0c0: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
f0d0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
f0e0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
f0f0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
f100: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
f110: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
f120: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
f130: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
f140: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
f150: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
f160: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
f170: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
f180: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
f190: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
f1a0: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
f1b0: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
f1c0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
f1d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f1e0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
f1f0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
f200: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
f210: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
f220: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
f230: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
f240: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
f250: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
f260: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
f270: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
f280: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
f290: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
f2a0: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
f2b0: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
f2c0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
f2d0: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
f2e0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
f2f0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
f300: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
f310: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
f320: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
f330: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
f340: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
f350: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
f360: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
f370: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
f380: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
f390: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
f3a0: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
f3b0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
f3c0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
f3d0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f3e0: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
f3f0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
f400: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
f410: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
f420: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
f430: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
f440: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
f450: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
f460: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
f470: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
f480: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
f490: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
f4a0: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
f4b0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f4c0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f4d0: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
f4e0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f4f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
f500: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
f510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
f520: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
f530: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f540: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
f550: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
f560: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
f570: 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  izer */ .  sqlit
f580: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
f590: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
f5a0: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
f5b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
f5c0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f5d0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f5e0: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
f5f0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
f600: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
f610: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
f620: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f630: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f640: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
f650: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
f660: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
f670: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
f680: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
f690: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
f6a0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f6b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f6c0: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
f6d0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
f6e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
f6f0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f700: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f710: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f720: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
f730: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
f740: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
f750: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
f760: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
f770: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
f780: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
f790: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f7a0: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
f7b0: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
f7c0: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
f7d0: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
f7e0: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
f7f0: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
f800: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
f810: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
f820: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
f830: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
f840: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f850: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
f860: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
f870: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
f880: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
f890: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
f8a0: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
f8b0: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
f8c0: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
f8d0: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
f8e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
f8f0: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
f900: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
f910: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
f920: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
f930: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
f940: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
f950: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
f960: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
f970: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
f980: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
f990: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
f9a0: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
f9b0: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
f9c0: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
f9d0: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
f9e0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
f9f0: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
fa00: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
fa10: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
fa20: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
fa30: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
fa40: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
fa50: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
fa60: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
fa70: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
fa80: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
fa90: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
faa0: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
fab0: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
fac0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
fad0: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
fae0: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
faf0: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
fb00: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
fb10: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
fb20: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
fb30: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
fb40: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
fb50: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
fb60: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
fb70: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
fb80: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
fb90: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
fba0: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
fbb0: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
fbc0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
fbd0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
fbe0: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
fbf0: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
fc00: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
fc10: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
fc20: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
fc30: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
fc40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
fc50: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
fc60: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
fc70: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
fc80: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
fc90: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
fca0: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
fcb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
fcc0: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
fcd0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
fce0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
fcf0: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
fd00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fd10: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
fd20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fd30: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
fd40: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
fd50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fd60: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
fd70: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
fd80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
fd90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
fda0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
fdb0: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
fdc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fdd0: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
fde0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
fdf0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
fe00: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
fe10: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
fe20: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
fe30: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
fe40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
fe50: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
fe60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fe70: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
fe80: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
fe90: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
fea0: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
feb0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
fec0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
fed0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
fee0: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
fef0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
ff00: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
ff10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
ff20: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
ff30: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
ff40: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
ff50: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
ff60: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
ff70: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
ff80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
ff90: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
ffa0: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
ffb0: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
ffc0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
ffd0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ffe0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
fff0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10000 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
10010 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10020 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
10030 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
10040 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
10050 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
10060 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
10070 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
10080 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
10090 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
100a0 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
100b0 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
100c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
100d0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
100e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
100f0 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
10100 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
10110 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
10120 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
10130 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
10140 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
10150 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
10160 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10170 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
10180 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
10190 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
101a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
101b0 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
101c0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
101d0 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
101e0 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
101f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10200 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
10210 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
10220 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
10230 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10250 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10260 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10270 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
10280 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
10290 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
102a0 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
102b0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
102c0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
102d0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
102e0 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
102f0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
10300 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
10310 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
10320 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
10330 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
10340 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
10350 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
10360 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
10370 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
10380 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
10390 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
103a0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
103b0 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
103c0 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
103d0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
103e0 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
103f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10400 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
10410 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
10420 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
10430 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
10440 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
10450 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
10460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10470 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
10480 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
10490 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
104a0 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
104b0 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
104c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
104d0 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
104e0 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
104f0 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
10500 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
10510 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
10520 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
10530 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
10540 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10550 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
10560 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
10570 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
10580 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
10590 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
105a0 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
105b0 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
105c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
105d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
105e0 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
105f0 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
10600 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10610 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10620 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
10630 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
10640 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
10650 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
10660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10670 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10680 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
10690 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
106a0 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
106b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
106c0 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
106d0 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
106e0 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
106f0 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
10700 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
10710 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
10720 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
10730 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
10740 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
10750 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
10760 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
10770 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10780 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10790 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
107a0 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
107b0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
107c0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
107d0 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
107e0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
107f0 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
10800 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
10810 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10820 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
10830 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
10840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10850 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
10860 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
10870 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
10880 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10890 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
108a0 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
108b0 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
108c0 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
108d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
108e0 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
108f0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
10900 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
10910 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10920 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
10930 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
10940 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
10950 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10960 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10970 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10980 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
10990 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
109a0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
109b0 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
109c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
109d0 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
109e0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
109f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
10a00 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
10a10 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
10a20 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
10a30 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10a40 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
10a50 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
10a60 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
10a70 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
10a80 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
10a90 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
10aa0 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
10ab0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
10ac0 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
10ad0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10ae0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
10af0 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
10b00 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
10b10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
10b20 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
10b30 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
10b40 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
10b50 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
10b60 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
10b70 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
10b80 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
10b90 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
10ba0 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
10bb0 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
10bc0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
10bd0 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
10be0 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
10bf0 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
10c00 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
10c10 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
10c20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
10c30 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
10c40 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
10c50 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
10c60 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
10c70 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
10c80 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
10c90 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
10ca0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
10cb0 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
10cc0 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
10cd0 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
10ce0 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
10cf0 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
10d00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10d10 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
10d20 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
10d30 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
10d40 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
10d50 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
10d60 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
10d70 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
10d80 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10d90 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
10da0 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
10db0 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
10dc0 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
10dd0 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
10de0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
10df0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
10e00 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
10e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e20 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
10e30 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10e40 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
10e50 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
10e60 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10e70 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
10e80 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
10e90 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
10ea0 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
10eb0 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
10ec0 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
10ed0 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
10ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
10ef0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
10f00 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
10f10 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
10f20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
10f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10f40 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
10f50 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
10f60 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
10f70 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
10f80 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
10f90 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
10fa0 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
10fb0 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
10fc0 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
10fd0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
10fe0 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
10ff0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
11000 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
11010 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
11020 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
11030 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
11040 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
11050 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
11060 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
11070 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
11080 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
11090 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
110a0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
110b0 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
110c0 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
110d0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
110e0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
110f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
11100 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
11110 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
11120 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11130 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
11140 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
11150 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
11160 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
11170 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
11180 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
11190 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
111a0 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
111b0 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
111c0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
111d0 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
111e0 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
111f0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
11200 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
11210 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
11220 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
11230 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
11240 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
11250 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
11260 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
11270 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
11280 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
11290 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
112a0 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
112b0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
112c0 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
112d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
112e0 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
112f0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
11300 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
11310 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
11320 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
11330 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
11340 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
11350 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
11360 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
11370 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
11380 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
11390 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
113a0 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
113b0 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
113c0 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
113d0 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
113e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
113f0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
11400 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
11410 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
11420 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
11430 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
11440 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
11450 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
11460 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
11470 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
11480 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
11490 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
114c0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
114d0 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
114e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
114f0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
11500 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
11510 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11530 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
11540 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
11550 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
11560 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
11570 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11580 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
11590 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
115a0 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115c0 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
115d0 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
115e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
115f0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
11600 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
11610 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
11620 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
11630 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
11640 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
11650 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11660 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21  _MEMORY .   || !
11670 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
11680 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  fd).  ){.    ret
11690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
116a0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
116b0 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
116c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
116d0 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
116e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
116f0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
11700 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
11710 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
11720 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
11730 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
11740 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
11750 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
11760 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
11770 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11780 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
11790 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
117a0 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
117b0 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
117c0 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
117d0 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
117e0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
117f0 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
11800 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
11810 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
11820 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
11830 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
11840 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
11850 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
11860 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
11870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
11880 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
11890 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
118a0 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
118b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
118c0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
118d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
118e0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
118f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
11900 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
11910 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
11920 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11930 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
11940 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
11950 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11960 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11970 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
11980 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
11990 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
119a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
119b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
119c0 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
119d0 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
119e0 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
119f0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11a00 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11a10 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
11a20 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
11a30 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11a40 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11a50 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
11a60 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
11a70 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
11a80 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
11a90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
11aa0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a  ournalMagic, 8,.
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
11ae0 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
11af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11b00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11b10 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
11b20 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
11b30 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
11b40 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
11b50 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
11b60 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
11b70 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
11b80 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11b90 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11ba0 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
11bb0 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
11bc0 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
11bd0 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
11be0 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
11bf0 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
11c00 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11c10 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11c20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
11c30 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
11c40 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
11c50 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
11c60 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
11c70 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
11c80 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11c90 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11ca0 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
11cb0 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
11cc0 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
11cd0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
11ce0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
11cf0 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
11d00 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11d10 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11d20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
11d30 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
11d40 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
11d50 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
11d60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11d70 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
11d80 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11d90 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11da0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11db0 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
11dc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
11dd0 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
11de0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11df0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
11e00 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11e10 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11e20 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
11e30 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74  {.  pPager->iDat
11e40 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71  aVersion++;.  sq
11e50 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
11e60 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
11e70 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  up);.  sqlite3Pc
11e80 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
11e90 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
11ea0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11eb0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11ec0 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33  sion value.*/.u3
11ed0 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 61  2 sqlite3PagerDa
11ee0 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20  taVersion(Pager 
11ef0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
11f00 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  rn pPager->iData
11f10 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  Version;.}../*.*
11f20 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
11f30 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
11f40 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
11f50 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
11f60 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
11f70 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
11f80 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
11f90 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
11fa0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
11fb0 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
11fc0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
11fd0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11fe0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
11ff0 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
12000 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
12010 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
12020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12030 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
12040 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
12050 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
12060 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
12070 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
12080 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
12090 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
120a0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
120b0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
120c0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
120d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
120e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
120f0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
12100 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
12110 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
12120 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
12130 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
12140 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12150 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
12160 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
12170 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
12180 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
12190 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
121a0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
121b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
121c0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
121d0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
121e0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
121f0 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
12200 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
12210 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
12220 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
12230 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
12240 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
12250 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
12260 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
12270 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
12280 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
12290 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
122a0 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
122d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
122e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
122f0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
12300 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
12310 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
12320 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
12330 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
12340 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
12350 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
12360 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
12370 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
12380 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
12390 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
123a0 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
123b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
123c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
123d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
123e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
123f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
12400 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
12410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12420 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12430 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
12440 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12450 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
12460 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
12470 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
12480 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
12490 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
124a0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
124b0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
124c0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
124d0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
124e0 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
124f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
12500 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
12510 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
12520 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
12530 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
12540 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
12550 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
12560 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
12570 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
12580 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
12590 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
125a0 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
125b0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
125c0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
125d0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
125e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
125f0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
12600 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12610 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
12620 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
12630 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
12640 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
12650 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
12660 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
12670 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
12680 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
12690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
126a0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
126b0 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
126c0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
126d0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
126e0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
126f0 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
12700 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
12710 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
12720 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
12730 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
12740 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12750 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
12760 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
12770 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
12780 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
12790 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
127a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
127b0 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
127c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
127d0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
127e0 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
127f0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
12800 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
12810 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
12820 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
12830 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
12840 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
12850 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
12860 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
12870 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
12880 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
12890 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
128a0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
128b0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
128c0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
128d0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
128e0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
128f0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
12900 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
12930 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
12940 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
12950 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
12960 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
12970 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
12980 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
12990 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
129a0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
129b0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
129c0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
129d0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
129e0 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
129f0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
12a00 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
12a10 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12a20 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
12a30 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
12a40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
12a50 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
12a60 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
12a70 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
12a80 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
12a90 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
12aa0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12ab0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
12ac0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
12ad0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12ae0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
12af0 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
12b00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12b10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12b20 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
12b30 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12b40 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12b50 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
12b60 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12b70 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12b80 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
12b90 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
12ba0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12bb0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
12bc0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
12bd0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
12be0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
12bf0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12c00 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
12c10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12c20 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
12c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12c40 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
12c50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12c60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
12c70 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12c80 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
12c90 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
12ca0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
12cb0 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
12cc0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
12cd0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
12ce0 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
12cf0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
12d00 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
12d10 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
12d20 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
12d30 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
12d40 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
12d50 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
12d60 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
12d70 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
12d80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12d90 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
12da0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
12db0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
12dc0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
12dd0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
12de0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
12df0 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
12e00 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
12e10 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
12e20 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
12e30 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
12e40 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
12e50 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
12e60 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
12e70 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
12e80 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
12e90 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
12ea0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
12eb0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
12ec0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12ed0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12ee0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12ef0 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12f00 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12f10 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12f20 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12f30 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12f40 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12f50 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12f60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12f70 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12f80 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12f90 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12fa0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12fb0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
12fc0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
12fd0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12fe0 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12ff0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
13000 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
13010 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
13020 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
13030 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
13040 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
13050 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
13060 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
13070 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
13080 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
13090 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
130a0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
130b0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
130c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
130d0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
130e0 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
130f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
13100 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
13110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13120 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
13130 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   (isOpen(pPager-
13140 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f 50  >jfd) ? PAGER_OP
13150 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44 45  EN : PAGER_READE
13160 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
13170 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
13180 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
13190 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
131a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
131b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
131c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65  QLITE_OK;.    se
131d0 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50  tGetterMethod(pP
131e0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50  ager);.  }..  pP
131f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13200 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13210 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
13220 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
13230 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter = 0;.}../*.*
13240 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13250 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
13260 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46  er an IOERR or F
13270 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72  ULL error that r
13280 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70  equires.** the p
13290 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69  ager to transiti
132a0 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  on into the ERRO
132b0 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76 65  R state may ahve
132c0 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68   occurred..** Th
132d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
132e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
132f0 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
13300 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
13310 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63   .** the error-c
13320 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
13330 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
13340 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
13350 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20  . The .** value 
13360 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
13370 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
13380 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
13390 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
133a0 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
133b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
133c0 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
133d0 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
133e0 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75   the.** IOERR su
133f0 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67  b-codes, the pag
13400 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45 52  er enters the ER
13410 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68  ROR state and th
13420 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
13430 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  is stored in Pag
13440 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c  er.errCode. Whil
13450 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d 61  e the pager rema
13460 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ins in the ERROR
13470 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d   state,.** all m
13480 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f  ajor API calls o
13490 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c  n the Pager will
134a0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
134b0 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64  urn Pager.errCod
134c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52  e..**.** The ERR
134d0 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61 74  OR state indicat
134e0 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
134f0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
13500 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
13510 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
13520 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
13530 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
13540 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
13550 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
13560 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
13570 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
13580 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
13590 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
135a0 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
135b0 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74  occurred, then t
135c0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
135d0 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
135e0 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74  to be replayed t
135f0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f  o restore the co
13600 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
13610 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
13620 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20  if.** it were a 
13630 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f  hot-journal)..*/
13640 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13650 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
13660 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
13670 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
13680 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
13690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
136a0 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
136b0 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
136c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
136d0 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
136e0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
136f0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
13700 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
13710 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
13720 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
13730 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d    );.  if( rc2==
13740 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72  SQLITE_FULL || r
13750 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
13760 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
13770 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
13780 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
13790 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a   = PAGER_ERROR;.
137a0 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74      setGetterMet
137b0 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  hod(pPager);.  }
137c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
137d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
137e0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
137f0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
13800 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
13810 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  e write transact
13820 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67  ion open on pPag
13830 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  er is being comm
13840 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d  itted (bCommit==
13850 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20  1).** or rolled 
13860 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30  back (bCommit==0
13870 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )..**.** Return 
13880 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79  TRUE if and only
13890 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61   if all dirty pa
138a0 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66 6c  ges should be fl
138b0 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ushed to disk..*
138c0 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a  *.** Rules:.**.*
138d0 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54  *   *  For non-T
138e0 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20 61  EMP databases, a
138f0 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64 69  lways sync to di
13900 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  sk.  This is nec
13910 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20 66  essary.**      f
13920 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  or transactions 
13930 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a  to be durable..*
13940 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20 54  *.**   *  Sync T
13950 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  EMP database onl
13960 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e  y on a COMMIT (n
13970 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77  ot a ROLLBACK) w
13980 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67 0a  hen the backing.
13990 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61 73  **      file has
139a0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61 6c   been created al
139b0 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70 69  ready (via a spi
139c0 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65 73  ll on pagerStres
139d0 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20  s()) and.**     
139e0 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
139f0 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
13a00 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65 64  in memory exceed
13a10 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f 74  s 25% of the tot
13a20 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68 65  al.**      cache
13a30 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
13a40 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68 4f   int pagerFlushO
13a50 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  nCommit(Pager *p
13a60 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  Pager, int bComm
13a70 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  it){.  if( pPage
13a80 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
13a90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
13aa0 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74 75   !bCommit ) retu
13ab0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73 4f  rn 0;.  if( !isO
13ac0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
13ad0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
13ae0 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61  turn (sqlite3PCa
13af0 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79 28  chePercentDirty(
13b00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13b10 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >=25);.}../*.** 
13b20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
13b30 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
13b40 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
13b50 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
13b60 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
13b70 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
13b80 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
13b90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
13ba0 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
13bb0 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
13bc0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
13bd0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
13be0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
13bf0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
13c00 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
13c10 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
13c20 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
13c30 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
13c40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
13c50 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
13c60 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
13c70 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
13c80 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
13c90 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
13ca0 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
13cb0 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
13cc0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
13cd0 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
13ce0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
13cf0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
13d00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
13d10 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
13d20 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
13d30 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
13d40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
13d50 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
13d60 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
13d70 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
13d80 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
13d90 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
13da0 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
13db0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
13dc0 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
13dd0 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
13de0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
13df0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
13e00 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
13e10 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
13e20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
13e30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
13e40 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
13e50 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
13e60 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
13e70 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
13e80 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13e90 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13ea0 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
13eb0 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
13ec0 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
13ed0 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
13ee0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
13ef0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13f00 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
13f10 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
13f20 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
13f30 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
13f40 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
13f50 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
13f60 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
13f70 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
13f80 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
13f90 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
13fa0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
13fb0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
13fc0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
13fd0 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
13fe0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
13ff0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
14000 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
14010 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
14020 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
14030 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
14040 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
14050 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
14060 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
14070 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
14080 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
14090 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
140a0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
140b0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
140c0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
140d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
140e0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
140f0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
14100 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
14110 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
14120 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
14130 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
14140 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
14150 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
14160 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
14170 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
14180 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
14190 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
141a0 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
141b0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
141c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
141d0 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
141e0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
141f0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
14200 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
14210 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
14220 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
14230 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
14240 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
14250 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
14260 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
14270 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
14280 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
14290 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
142a0 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
142b0 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
142c0 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
142d0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
142e0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
142f0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
14300 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
14310 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
14320 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
14330 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
14340 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
14350 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
14360 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
14370 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
14380 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
14390 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
143a0 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
143b0 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
143c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
143d0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
143e0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
143f0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
14400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14410 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
14420 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
14430 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
14440 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
14450 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
14460 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
14470 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
14480 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
14490 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
144a0 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
144b0 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
144c0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
144d0 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
144e0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
144f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
14500 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d  Master, int bCom
14510 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  mit){.  int rc =
14520 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
14530 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
14540 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  rom journal fina
14550 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  lization operati
14560 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20  on */.  int rc2 
14570 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14580 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
14590 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f  rom db file unlo
145a0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ck operation */.
145b0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
145c0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f   if the pager do
145d0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f  es not have an o
145e0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
145f0 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74  ction.  ** or at
14600 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
14610 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e  D lock. This fun
14620 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
14630 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20  led when there. 
14640 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d   ** is no write-
14650 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
14660 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45  ve but a RESERVE
14670 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
14680 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75  k is.  ** held u
14690 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73  nder two circums
146a0 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  tances:.  **.  *
146b0 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73  *   1. After a s
146c0 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f  uccessful hot-jo
146d0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
146e0 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  it is called wit
146f0 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61  h.  **      eSta
14700 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61  te==PAGER_NONE a
14710 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
14720 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20  IVE_LOCK..  **. 
14730 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f   **   2. If a co
14740 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f  nnection with lo
14750 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
14760 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  sive holding an 
14770 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20  EXCLUSIVE .  ** 
14780 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68       lock switch
14790 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69  es back to locki
147a0 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61  ng_mode=normal a
147b0 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73  nd then executes
147c0 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61   a.  **      rea
147d0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  d-transaction, t
147e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
147f0 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61  called with eSta
14800 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
14810 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20   .  **      and 
14820 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
14830 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72  _LOCK when the r
14840 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
14850 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a  is closed..  */.
14860 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
14870 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
14880 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
14890 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
148a0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
148b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
148c0 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
148d0 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61  ER_LOCKED && pPa
148e0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52  ger->eLock<RESER
148f0 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
14900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14910 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  ;.  }..  release
14920 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
14930 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
14940 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
14950 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
14960 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20  pInJournal==0 . 
14970 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33       || (sqlite3
14980 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
14990 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
149a0 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
149b0 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
149c0 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
149d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
149e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
149f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14a00 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
14a10 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
14a20 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
14a30 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
14a40 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
14a50 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
14a60 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61    /* assert( pPa
14a70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14a80 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14a90 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f  ODE_MEMORY ); */
14aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
14ab0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
14ac0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
14ad0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14ae0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14af0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
14b00 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
14b10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14b20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
14b30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b60 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
14b70 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
14b80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14b90 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
14ba0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
14bb0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
14bc0 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c  sure the new fil
14bd0 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74 65  e size is writte
14be0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65  n into the inode
14bf0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
14c00 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
14c10 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ise the journal 
14c20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74 20  might resurrect 
14c30 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
14c40 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20  r loss and.     
14c50 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
14c60 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69  e last transacti
14c70 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  on to roll back.
14c80 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20 20    See.          
14c90 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  ** https://bugzi
14ca0 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f  lla.mozilla.org/
14cb0 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
14cc0 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20  1072773.        
14cd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
14ce0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
14cf0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
14d00 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
14d10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14d20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
14d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14d40 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
14d50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14d60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14d70 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
14d80 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
14d90 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14da0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
14db0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
14dc0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
14dd0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
14de0 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
14df0 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
14e00 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  r||pPager->tempF
14e10 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ile);.      pPag
14e20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14e30 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14e40 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14e50 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
14e60 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
14e70 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
14e80 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
14e90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14ea0 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14eb0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
14ec0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14ed0 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
14ee0 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
14ef0 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
14f00 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
14f10 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14f20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14f30 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
14f40 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
14f50 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
14f60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
14f70 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
14f80 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
14f90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14fa0 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14fb0 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
14fc0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14fd0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14fe0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14ff0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
15000 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
15010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
15020 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
15030 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
15040 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
15050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
15060 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
15070 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
15080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
15090 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
150a0 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
150b0 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
150c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
150d0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
150e0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
150f0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
15100 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
15110 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
15120 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
15130 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
15140 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
15150 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
15160 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
15170 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
15180 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
15190 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
151a0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
151b0 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
151c0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
151d0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
151e0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
151f0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
15200 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
15210 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
15220 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
15230 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
15240 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
15250 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
15260 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
15270 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
15280 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
15290 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
152a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
152b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
152c0 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65 72 46   MEMDB || pagerF
152d0 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61  lushOnCommit(pPa
152e0 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20 29 7b  ger, bCommit) ){
152f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
15300 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
15310 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
15320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15330 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
15340 61 72 57 72 69 74 61 62 6c 65 28 70 50 61 67 65  arWritable(pPage
15350 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
15360 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63   }.    sqlite3Pc
15370 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
15380 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
15390 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
153a0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
153b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
153c0 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
153d0 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c   WAL write-lock,
153e0 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69   if any. Also, i
153f0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
15400 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20   was in .    ** 
15410 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
15420 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20  lusive mode but 
15430 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72  is no longer, dr
15440 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
15450 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65   .    ** lock he
15460 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
15470 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
15480 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
15490 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
154a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
154b0 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
154c0 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
154d0 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  K );.  }else if(
154e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
154f0 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61  & bCommit && pPa
15500 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
15510 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
15520 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  {.    /* This br
15530 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
15540 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
15550 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72  transaction in r
15560 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a  ollback-journal.
15570 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74      ** mode if t
15580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15590 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67   on disk is larg
155a0 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
155b0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
155c0 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
155d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
155e0 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
155f0 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
15600 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63  ion .    ** succ
15610 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74  essfully committ
15620 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c  ed, but the EXCL
15630 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74  USIVE lock is st
15640 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  ill held on the.
15650 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
15660 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72  it is safe to tr
15670 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
15680 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20  ase file to its 
15690 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72  minimum.    ** r
156a0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a  equired size.  *
156b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
156c0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
156d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
156e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
156f0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
15700 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
15710 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
15720 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
15730 6d 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  mit ){.    rc = 
15740 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
15750 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
15760 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f   SQLITE_FCNTL_CO
15770 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20 30  MMIT_PHASETWO, 0
15780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15790 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
157a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
157b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
157c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
157d0 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65  de .   && (!page
157e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
157f0 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  || sqlite3WalExc
15800 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
15810 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29  r->pWal, 0)).  )
15820 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  {.    rc2 = page
15830 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
15840 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
15850 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
15860 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
15870 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65  .  }.  pPager->e
15880 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
15890 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ADER;.  pPager->
158a0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  setMaster = 0;..
158b0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
158c0 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
158d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
158e0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
158f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
15900 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
15910 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
15920 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
15930 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
15940 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
15950 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15960 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  e, do not attemp
15970 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  t .** the rollba
15980 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ck at this time.
15990 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f   Instead, pager_
159a0 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c  unlock() is call
159b0 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20  ed. The.** call 
159c0 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
159d0 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61  ) will discard a
159e0 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
159f0 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68  es, unlock.** th
15a00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15a10 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67  and move the pag
15a20 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  er back to OPEN 
15a30 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a  state. If this .
15a40 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
15a50 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75  ere is a hot-jou
15a60 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65  rnal left in the
15a70 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
15a80 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65  e next .** conne
15a90 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
15aa0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
15ab0 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63   the pager (whic
15ac0 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e  h may be this on
15ad0 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c  e) .** will roll
15ae0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
15af0 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
15b00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
15b10 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
15b20 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
15b30 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
15b40 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
15b50 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
15b60 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
15b70 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
15b80 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
15b90 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
15ba0 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
15bb0 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
15bc0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
15bd0 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
15be0 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
15bf0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
15c00 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
15c10 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
15c20 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15c30 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
15c40 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e  RROR && pPager->
15c50 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
15c60 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EN ){.    assert
15c70 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
15c80 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
15c90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15ca0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15cb0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
15cc0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
15cd0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
15ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
15cf0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
15d00 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
15d10 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
15d20 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  c();.    }else i
15d30 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
15d40 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
15d50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15d60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
15d70 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20  _READER );.     
15d80 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
15d90 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
15da0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
15db0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
15dc0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
15dd0 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
15de0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
15df0 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
15e00 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
15e10 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
15e20 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
15e30 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
15e40 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
15e50 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
15e60 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
15e70 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15e80 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
15e90 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
15ea0 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
15eb0 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
15ec0 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
15ed0 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
15ee0 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
15ef0 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
15f00 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
15f10 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
15f20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
15f30 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
15f40 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
15f50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
15f60 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
15f70 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
15f80 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
15f90 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
15fa0 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
15fb0 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
15fc0 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
15fd0 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
15fe0 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
15ff0 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
16000 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
16010 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
16020 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
16030 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
16040 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
16050 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
16060 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
16070 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
16080 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
16090 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
160a0 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
160b0 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
160c0 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
160d0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
160e0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
160f0 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
16100 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
16110 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
16120 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
16130 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
16140 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
16150 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
16160 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
16170 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
16180 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
16190 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
161a0 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
161b0 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
161c0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
161d0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
161e0 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
161f0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
16200 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
16210 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
16220 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
16230 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
16240 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
16250 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
16260 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
16270 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
16280 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
16290 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
162a0 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
162b0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
162c0 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
162d0 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
162e0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
162f0 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
16300 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
16310 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
16320 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
16330 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
16340 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
16350 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
16360 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
16370 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
163a0 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
163b0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
163c0 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
163d0 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
163e0 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
163f0 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
16400 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
16410 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16420 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  DEC./*.** Make s
16430 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
16440 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20  f reserved bits 
16450 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20 74  is the same in t
16460 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a  he destination.*
16470 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69 73  * pager as it is
16480 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e 20   in the source. 
16490 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20 77   This comes up w
164a0 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68 61  hen a VACUUM cha
164b0 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  nges the.** numb
164c0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
164d0 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74 69  its to the "opti
164e0 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a  mal" amount..*/.
164f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
16500 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50 61  rAlignReserve(Pa
16510 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67 65  ger *pDest, Page
16520 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28 20  r *pSrc){.  if( 
16530 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 21  pDest->nReserve!
16540 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 20  =pSrc->nReserve 
16550 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 52  ){.    pDest->nR
16560 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e  eserve = pSrc->n
16570 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
16580 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44 65  erReportSize(pDe
16590 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  st);.  }.}.#endi
165a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
165b0 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
165c0 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
165d0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
165e0 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
165f0 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
16600 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
16610 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
16620 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
16630 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
16640 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
16650 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
16660 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
16670 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
16680 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
16690 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
166a0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
166b0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
166c0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
166d0 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
166e0 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
166f0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
16700 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
16710 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
16720 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
16730 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
16740 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
16750 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
16760 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
16770 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
16780 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
16790 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
167a0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
167b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
167c0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
167d0 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
167e0 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
167f0 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
16800 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
16810 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
16820 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
16830 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
16840 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
16850 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
16860 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
16870 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
16880 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
16890 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
168a0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
168b0 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
168c0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
168d0 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
168e0 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
168f0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
16900 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
16910 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
16920 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
16930 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16940 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
16950 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
16960 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16970 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
16980 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
16990 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
169a0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
169b0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
169c0 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
169d0 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
169e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
169f0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
16a00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16a10 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
16a20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
16a30 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16a40 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
16a50 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
16a60 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
16a70 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
16a80 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
16a90 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
16aa0 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
16ab0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
16ac0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
16ad0 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
16ae0 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
16af0 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
16b00 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
16b10 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
16b20 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
16b30 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
16b40 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
16b50 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
16b60 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
16b70 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
16b80 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
16b90 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
16ba0 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
16bb0 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
16bc0 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
16bd0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
16be0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
16bf0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16c00 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
16c10 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
16c20 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
16c30 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
16c40 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
16c50 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
16c60 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
16c70 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
16c80 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
16c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ca0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
16cb0 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
16cc0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16ce0 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
16cf0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
16d00 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
16d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
16d20 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
16d30 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
16d40 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d60 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
16d70 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
16d80 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
16d90 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
16da0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
16db0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
16dc0 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
16dd0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
16de0 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
16df0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
16e00 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16e10 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
16e20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
16e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16e40 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
16e50 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
16e60 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
16e70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
16e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16e90 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
16ea0 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
16eb0 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ed0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
16ee0 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
16ef0 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
16f00 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
16f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
16f20 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
16f30 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
16f40 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16f50 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
16f60 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
16f70 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
16f80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
16f90 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fb0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
16fc0 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
16fd0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
16fe0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a  E_HAS_CODEC.  /*
16ff0 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61   The jrnlEnc fla
17000 67 20 69 73 20 74 72 75 65 20 69 66 20 4a 6f 75  g is true if Jou
17010 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f 75 6c  rnal pages shoul
17020 64 20 62 65 20 70 61 73 73 65 64 20 74 68 72 6f  d be passed thro
17030 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64  ugh.  ** the cod
17040 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c 73 65  ec.  It is false
17050 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d   for pure in-mem
17060 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ory journals. */
17070 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e  .  const int jrn
17080 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72  lEnc = (isMainJr
17090 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  nl || pPager->su
170a0 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a  bjInMemory==0);.
170b0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
170c0 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
170d0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
170e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
170f0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
17100 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
17110 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
17120 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
17130 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
17140 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
17150 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
17160 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
17170 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
17180 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
17190 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
171a0 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
171b0 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
171c0 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
171d0 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
171e0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
171f0 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
17200 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
17210 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
17220 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
17230 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
17240 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
17250 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
17260 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
17270 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
17280 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65  .  /* Either the
17290 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65   state is greate
172a0 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49  r than PAGER_WRI
172b0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20  TER_CACHEMOD (a 
172c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
172d0 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  * or savepoint r
172e0 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20  ollback done at 
172f0 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74  the request of t
17300 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68  he caller) or th
17310 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74  is is.  ** a hot
17320 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
17330 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f  k. If it is a ho
17340 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
17350 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20  ck, the pager.  
17360 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f  ** is in state O
17370 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e  PEN and holds an
17380 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
17390 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot-journal rol
173a0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20  lback.  ** only 
173b0 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  reads from the m
173c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  ain journal, not
173d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
173e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
173f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
17400 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
17410 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
17420 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
17430 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
17440 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
17450 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
17460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17470 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17480 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17490 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e  MOD || isMainJrn
174a0 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  l );..  /* Read 
174b0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
174c0 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
174d0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
174e0 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
174f0 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
17500 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
17510 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
17520 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
17530 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
17540 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
17550 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
17560 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
17570 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
17580 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
17590 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
175a0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
175b0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
175c0 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
175d0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
175e0 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
175f0 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
17600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
17620 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
17630 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
17640 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
17650 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
17660 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
17670 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
17680 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
17690 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
176a0 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
176b0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
176c0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
176d0 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
176e0 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
176f0 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
17700 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
17710 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
17720 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
17730 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
17740 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
17750 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
17760 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
17770 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
17780 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
17790 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
177a0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
177b0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
177c0 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
177d0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
177e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
177f0 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
17800 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
17810 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
17820 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
17830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17840 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
17850 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
17860 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17870 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
17880 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
17890 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
178a0 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
178b0 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
178c0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
178d0 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
178e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
178f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
17900 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
17910 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  s page has alrea
17920 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
17930 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e  ack before durin
17940 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
17950 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
17960 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
17970 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
17980 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
17990 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
179a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
179b0 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
179c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
179d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
179e0 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
179f0 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
17a00 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
17a10 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
17a20 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
17a30 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
17a40 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
17a50 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
17a60 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
17a70 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
17a80 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
17a90 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
17aa0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
17ab0 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
17ac0 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
17ad0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
17ae0 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
17af0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
17b00 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
17b10 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
17b20 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
17b30 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
17b40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17b50 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
17b60 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
17b70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
17b80 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
17b90 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
17ba0 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
17bb0 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
17bc0 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
17bd0 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
17be0 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
17bf0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
17c00 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
17c10 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
17c20 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
17c30 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
17c40 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
17c50 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
17c60 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
17c70 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
17c80 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
17c90 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
17ca0 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
17cb0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
17cc0 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
17cd0 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
17ce0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
17cf0 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
17d00 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
17d10 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
17d20 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
17d30 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
17d40 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
17d50 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
17d60 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
17d70 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
17d80 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
17d90 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
17da0 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
17db0 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
17dc0 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
17dd0 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
17de0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
17df0 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
17e00 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
17e10 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
17e20 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
17e30 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
17e40 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
17e50 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
17e60 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
17e70 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
17e80 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
17e90 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
17ea0 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
17eb0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
17ec0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17ed0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17ee0 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
17ef0 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
17f00 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
17f10 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
17f20 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
17f30 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
17f40 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
17f50 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
17f60 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
17f70 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
17f80 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
17f90 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
17fa0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
17fb0 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
17fc0 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
17fd0 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
17fe0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
17ff0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
18000 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
18010 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
18020 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
18030 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
18040 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
18050 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
18060 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
18070 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
18080 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
18090 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
180a0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
180b0 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
180c0 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
180d0 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
180e0 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
180f0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
18100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
18110 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
18120 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
18130 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
18140 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
18150 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
18160 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
18170 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
18180 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
18190 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
181a0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
181b0 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
181c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
181d0 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
181e0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
181f0 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
18200 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
18210 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
18220 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
18230 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
18240 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
18250 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
18260 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
18270 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
18280 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
18290 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
182a0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
182b0 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
182c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
182d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
182e0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
182f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
18300 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
18310 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
18320 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
18330 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
18340 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
18350 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
18360 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
18370 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
18380 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41 47  empFile );.  PAG
18390 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
183a0 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
183b0 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
183c0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
183d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
183e0 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
183f0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
18400 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
18410 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
18420 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
18430 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
18440 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
18450 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
18460 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
18470 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
18480 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
18490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
184a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
184b0 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
184c0 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
184d0 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
184e0 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
184f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
18500 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61  ->fd).   && (pPa
18510 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
18520 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
18530 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
18540 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
18550 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
18560 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
18570 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
18580 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18590 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
185a0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
185b0 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
185c0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
185d0 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  YNC)!=0 );.    a
185e0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
185f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
18600 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
18610 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d 20   data read from 
18620 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
18630 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18640 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  se file..    ** 
18650 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
18660 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20 61 6e  safe even for an
18670 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
18680 61 73 65 20 2d 20 61 73 20 74 68 65 20 64 61 74  ase - as the dat
18690 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 63  a.    ** was enc
186a0 72 79 70 74 65 64 20 62 65 66 6f 72 65 20 69 74  rypted before it
186b0 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
186c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
186d0 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
186e0 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 65      ** is if the
186f0 20 64 61 74 61 20 77 61 73 20 6a 75 73 74 20 72   data was just r
18700 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d  ead from an in-m
18710 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
18720 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20 20 2a  l. In that.    *
18730 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74 20 62  * case it must b
18740 65 20 65 6e 63 72 79 70 74 65 64 20 68 65 72 65  e encrypted here
18750 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63 6f   before it is co
18760 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61  pied into the da
18770 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
18780 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  le.  */.#ifdef S
18790 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
187a0 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63      if( !jrnlEnc
187b0 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 32   ){.      CODEC2
187c0 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
187d0 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
187e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61  TE_NOMEM_BKPT, a
187f0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63 20  Data);.      rc 
18800 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
18810 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
18820 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
18830 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
18840 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
18850 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
18860 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18870 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
18880 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
18890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
188a0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
188b0 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
188c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
188d0 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69  e, ofst);..    i
188e0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
188f0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
18900 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
18910 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
18920 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18930 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
18940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
18950 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 69 66  S_CODEC.      if
18960 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20  ( jrnlEnc ){.   
18970 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
18980 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
18990 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
189a0 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20  MEM_BKPT);.     
189b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
189c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
189d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
189e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
189f0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
18a00 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
18a10 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18a20 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20  M_BKPT,aData);. 
18a30 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
18a40 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  f.      sqlite3B
18a50 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
18a60 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
18a70 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
18a80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18a90 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
18aa0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
18ab0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
18ac0 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
18ad0 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
18ae0 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
18af0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
18b00 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
18b10 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
18b20 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
18b30 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
18b40 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
18b50 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
18b60 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
18b70 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
18b80 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
18b90 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
18ba0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
18bb0 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
18bc0 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
18bd0 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
18be0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
18bf0 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
18c00 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
18c10 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
18c20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
18c30 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
18c40 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
18c50 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
18c60 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
18c70 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
18c80 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
18c90 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
18ca0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
18cb0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
18cc0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
18cd0 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
18ce0 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
18cf0 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
18d00 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
18d10 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
18d20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
18d30 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
18d40 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
18d50 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
18d60 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
18d70 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
18d80 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
18d90 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
18da0 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
18db0 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
18dc0 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
18dd0 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
18de0 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
18df0 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
18e00 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
18e10 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
18e20 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
18e30 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
18e40 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18e50 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18e60 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ACK)==0 );.    p
18e70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18e80 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52  l |= SPILLFLAG_R
18e90 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20  OLLBACK;.    rc 
18ea0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
18eb0 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
18ec0 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
18ed0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
18ee0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
18ef0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
18f00 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
18f10 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
18f20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
18f30 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
18f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18f50 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
18f60 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
18f70 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
18f80 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
18f90 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
18fa0 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
18fb0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
18fc0 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
18fd0 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
18fe0 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
18ff0 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
19000 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
19010 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
19020 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
19030 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
19040 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
19050 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
19060 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
19070 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
19080 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
19090 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
190a0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
190b0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
190c0 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
190d0 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
190e0 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
190f0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
19100 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
19110 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
19120 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
19130 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
19140 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73 65  );.    /* It use
19150 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71 6c  d to be that sql
19160 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
19170 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61 6c  ean(pPg) was cal
19180 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a 20  led here.  But. 
19190 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20     ** that call 
191a0 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61 6e  was dangerous an
191b0 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74 61  d had no detecta
191c0 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e 63  ble benefit sinc
191d0 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20 20  e the cache.    
191e0 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  ** is normally c
191f0 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74 65  leaned by sqlite
19200 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
19210 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  ) after rollback
19220 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68   and so.    ** h
19230 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  as been removed.
19240 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73 65   */.    pager_se
19250 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
19260 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
19270 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
19280 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
19290 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
192a0 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
192b0 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
192c0 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
192d0 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
192e0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
192f0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
19300 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
19310 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
19320 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
19330 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
19340 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
19350 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
19360 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c   disk */.#if SQL
19370 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
19380 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b    if( jrnlEnc ){
19390 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
193a0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
193b0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
193c0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65  OMEM_BKPT); }.#e
193d0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
193e0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
193f0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
19400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
19410 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
19420 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
19430 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19440 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
19450 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
19460 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
19470 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19480 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
19490 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
194a0 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
194b0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
194c0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
194d0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
194e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
194f0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
19500 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
19510 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
19520 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
19530 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
19540 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
19550 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
19560 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
19570 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
19580 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
19590 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
195a0 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
195b0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
195c0 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
195d0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
195e0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
195f0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
19600 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
19610 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
19620 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
19630 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
19640 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
19650 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
19660 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
19670 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
19680 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
19690 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
196a0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
196b0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
196c0 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
196d0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
196e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
196f0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
19700 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
19710 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
19720 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
19730 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
19740 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
19750 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
19760 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
19770 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
19780 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19790 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
197a0 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
197b0 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
197c0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
197d0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
197e0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
197f0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
19800 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
19810 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
19820 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
19830 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
19840 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
19850 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
19860 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
19870 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
19880 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
19890 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
198a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
198b0 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
198c0 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
198d0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
198e0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
198f0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
19900 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
19910 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
19920 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
19930 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
19940 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
19950 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
19960 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
19970 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
19980 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
19990 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
199a0 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
199b0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
199c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
199d0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
199e0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
199f0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
19a00 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
19a10 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19a20 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
19a30 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
19a40 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
19a50 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
19a60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
19a70 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19a80 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
19a90 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
19aa0 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
19ab0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19ac0 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
19ad0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
19ae0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
19af0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
19b00 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
19b10 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
19b20 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19b30 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
19b40 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
19b50 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
19b60 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
19b70 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
19b80 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
19b90 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
19ba0 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
19bb0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
19bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
19bd0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
19be0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
19bf0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
19c00 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19c10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19c20 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
19c30 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
19c40 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
19c50 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19c60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19c70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
19c80 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
19c90 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
19ca0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
19cb0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
19cc0 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
19cd0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
19ce0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
19cf0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19d00 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
19d10 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
19d20 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
19d30 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
19d40 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
19d50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
19d60 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
19d70 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
19d80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
19d90 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
19da0 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
19db0 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
19dc0 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
19dd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
19de0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
19df0 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
19e00 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
19e10 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
19e20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
19e30 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
19e40 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
19e50 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
19e60 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
19e70 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
19e80 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
19e90 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
19ea0 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
19eb0 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
19ec0 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
19ed0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
19ee0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
19ef0 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
19f00 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
19f10 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
19f20 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
19f30 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
19f40 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19f50 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
19f60 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
19f70 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23 69   int flags = .#i
19f80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19f90 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
19fa0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76        (pPager->v
19fb0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
19fc0 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49  PEN_FILEPROTECTI
19fd0 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66  ON_MASK)|.#endif
19fe0 0a 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f  .      (SQLITE_O
19ff0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
1a000 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1a010 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
1a020 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1a030 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1a040 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
1a050 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1a060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1a070 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a080 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
1a090 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1a0a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
1a0b0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
1a0c0 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
1a0d0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
1a0e0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
1a0f0 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
1a100 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
1a110 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1a120 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
1a130 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
1a140 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
1a150 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
1a160 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
1a170 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
1a180 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
1a190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1a1a0 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
1a1b0 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
1a1c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a1d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
1a1e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
1a1f0 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
1a200 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
1a210 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
1a220 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1a230 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
1a240 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
1a250 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
1a260 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
1a270 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a280 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  M_BKPT;.    goto
1a290 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a2a0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
1a2b0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
1a2c0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
1a2d0 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
1a2e0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
1a2f0 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
1a300 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
1a310 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
1a320 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a330 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
1a340 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
1a350 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
1a360 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
1a370 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
1a380 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
1a390 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
1a3a0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
1a3b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
1a3c0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
1a3d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a3e0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1a3f0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1a400 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1a410 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
1a420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a430 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
1a440 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
1a450 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
1a460 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
1a470 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
1a480 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
1a490 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a4a0 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
1a4b0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
1a4c0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
1a4d0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
1a4e0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
1a4f0 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
1a500 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
1a510 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1a520 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
1a530 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
1a540 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
1a550 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  = .#if SQLITE_EN
1a560 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
1a570 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 28 70 50  TION.        (pP
1a580 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
1a590 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
1a5a0 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
1a5b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1a5c0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
1a5d0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
1a5e0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
1a5f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a600 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1a610 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
1a620 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
1a630 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a650 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a660 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
1a670 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
1a680 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
1a690 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
1a6a0 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
1a6b0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
1a6c0 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
1a6d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a6e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a6f0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a700 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
1a710 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
1a720 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
1a730 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
1a740 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
1a750 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
1a760 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
1a770 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
1a780 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1a790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
1a7a0 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  /.        goto d
1a7b0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a7c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a7d0 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c  zJournal += (sql
1a7e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f  ite3Strlen30(zJo
1a7f0 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20  urnal)+1);.  }. 
1a800 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
1a810 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  e(pMaster);.  rc
1a820 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
1a830 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
1a840 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
1a850 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
1a860 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
1a870 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73  nal);.  if( pMas
1a880 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
1a890 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
1a8a0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
1a8b0 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c  !isOpen(pJournal
1a8c0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1a8d0 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
1a8e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a8f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1a900 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1a910 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
1a920 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
1a930 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
1a940 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
1a950 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
1a960 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
1a970 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
1a980 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
1a990 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
1a9a0 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
1a9b0 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
1a9c0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
1a9d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
1a9e0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1a9f0 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
1aa00 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  r the pager is n
1aa10 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  ot in either.** 
1aa20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74  DBMOD or OPEN st
1aa30 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
1aa40 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
1aa50 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
1aa60 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  ze .** of the fi
1aa70 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  le is changed to
1aa80 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
1aa90 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
1aaa0 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a  Size bytes). .**
1aab0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
1aac0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
1aad0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
1aae0 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
1aaf0 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
1ab00 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
1ab10 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
1ab20 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
1ab30 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
1ab40 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
1ab50 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
1ab60 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
1ab70 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
1ab80 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
1ab90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
1aba0 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
1abb0 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
1abc0 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
1abd0 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
1abe0 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
1abf0 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
1ac00 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
1ac10 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
1ac20 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
1ac30 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
1ac40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
1ac50 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
1ac60 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1ac70 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
1ac80 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
1ac90 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1aca0 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
1acb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1acc0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
1acd0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
1ace0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
1acf0 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
1ad00 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
1ad10 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
1ad20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ad30 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1ad40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1ad50 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
1ad60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ad70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
1ad80 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
1ad90 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1ada0 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
1adb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1adc0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1add0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1ade0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
1adf0 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
1ae00 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
1ae10 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61  ze;.    int szPa
1ae20 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
1ae30 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
1ae40 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1ae50 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1ae60 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   );.    /* TODO:
1ae70 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75   Is it safe to u
1ae80 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  se Pager.dbFileS
1ae90 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20  ize here? */.   
1aea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1aeb0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1aec0 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
1aed0 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
1aee0 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61   szPage*(i64)nPa
1aef0 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
1af00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
1af10 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
1af20 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
1af30 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
1af40 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
1af50 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
1af60 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
1af70 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
1af80 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72   }else if( (curr
1af90 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c  entSize+szPage)<
1afa0 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
1afb0 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d      char *pTmp =
1afc0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1afd0 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ce;.        mems
1afe0 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61  et(pTmp, 0, szPa
1aff0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ge);.        tes
1b000 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
1b010 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65  szPage) == curre
1b020 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
1b030 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
1b040 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20  Size-szPage) >  
1b050 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
1b060 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b070 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1b080 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50  r->fd, pTmp, szP
1b090 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50  age, newSize-szP
1b0a0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1b0b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b0c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b0d0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
1b0e0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1b0f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1b100 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b110 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61  *.** Return a sa
1b120 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  nitized version 
1b130 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  of the sector-si
1b140 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46  ze of OS file pF
1b150 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ile. The.** retu
1b160 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72  rn value is guar
1b170 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65  anteed to lie be
1b180 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58  tween 32 and MAX
1b190 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
1b1a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74  .int sqlite3Sect
1b1b0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1b1c0 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
1b1d0 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65  nt iRet = sqlite
1b1e0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46  3OsSectorSize(pF
1b1f0 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74  ile);.  if( iRet
1b200 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20  <32 ){.    iRet 
1b210 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69  = 512;.  }else i
1b220 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54  f( iRet>MAX_SECT
1b230 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
1b240 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
1b250 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
1b260 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45     iRet = MAX_SE
1b270 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20  CTOR_SIZE;.  }. 
1b280 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
1b290 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
1b2a0 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
1b2b0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1b2c0 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
1b2d0 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
1b2e0 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
1b2f0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1b300 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
1b310 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
1b320 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1b330 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
1b340 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
1b350 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
1b360 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
1b370 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
1b380 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
1b390 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
1b3a0 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
1b3b0 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
1b3c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
1b3d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
1b3e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1b3f0 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
1b400 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
1b410 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1b420 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
1b430 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
1b440 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1b450 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
1b460 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1b470 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
1b480 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
1b490 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
1b4a0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
1b4b0 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
1b4c0 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
1b4d0 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
1b4e0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
1b4f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1b500 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1b510 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45  e has the SQLITE
1b520 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1b530 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65  _OVERWRITE prope
1b540 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  rty, then set.**
1b550 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b560 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74  ector size to it
1b570 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  s minimum value 
1b580 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70  (512).  The purp
1b590 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72  ose of.** pPager
1b5a0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
1b5b0 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62  to define the "b
1b5c0 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20  last radius" of 
1b5d0 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69  bytes that.** mi
1b5e0 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20  ght change if a 
1b5f0 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69  crash occurs whi
1b600 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  le writing to a 
1b610 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a  single byte in.*
1b620 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42  * that range.  B
1b630 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46  ut with POWERSAF
1b640 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65  E_OVERWRITE, the
1b650 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73   blast radius is
1b660 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69   zero.** (that i
1b670 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45  s what POWERSAFE
1b680 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73  _OVERWRITE means
1b690 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a  ), so we minimiz
1b6a0 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20  e the sector.** 
1b6b0 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77  size.  For backw
1b6c0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
1b6d0 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ty of the rollba
1b6e0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
1b6f0 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61  format,.** we ca
1b700 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20  nnot reduce the 
1b710 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1b720 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e   size below 512.
1b730 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b740 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
1b750 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b760 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1b770 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1b780 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1b790 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1b7a0 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20  >tempFile.   || 
1b7b0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1b7c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1b7d0 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20  pPager->fd) & . 
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1b7f0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1b800 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d  AFE_OVERWRITE)!=
1b810 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  0.  ){.    /* Se
1b820 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
1b830 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
1b840 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
1b850 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
1b860 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
1b870 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
1b880 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
1b890 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
1b8a0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
1b8b0 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f  ill segfault. */
1b8c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1b8d0 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
1b8e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
1b8f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1b900 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1b910 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
1b920 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
1b930 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
1b940 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
1b950 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1b960 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
1b970 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
1b980 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
1b990 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
1b9a0 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
1b9b0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1b9c0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
1b9d0 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
1b9e0 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
1b9f0 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
1ba00 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
1ba10 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1ba20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1ba30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1ba40 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
1ba50 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
1ba60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1ba70 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
1ba80 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1ba90 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1baa0 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
1bab0 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
1bac0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
1bad0 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
1bae0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1baf0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1bb00 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
1bb10 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
1bb20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
1bb30 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
1bb40 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
1bb50 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1bb60 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
1bb70 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
1bb80 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
1bb90 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
1bba0 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
1bbb0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1bbc0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1bbd0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
1bbe0 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
1bbf0 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
1bc00 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1bc10 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
1bc20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1bc30 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1bc40 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
1bc50 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
1bc60 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
1bc70 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
1bc80 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
1bc90 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1bca0 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1bcb0 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1bcc0 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1bcd0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1bce0 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1bcf0 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1bd00 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1bd10 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1bd20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1bd30 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1bd40 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1bd50 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1bd60 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1bd70 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1bd80 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1bd90 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1bda0 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1bdb0 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1bdc0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1bdd0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1bde0 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1bdf0 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1be00 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1be10 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1be20 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1be30 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1be40 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1be50 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1be60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1be70 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1be80 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1be90 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1bea0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1beb0 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1bec0 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1bed0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1bee0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1bef0 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1bf00 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1bf10 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1bf20 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1bf30 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1bf40 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1bf50 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1bf60 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1bf70 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1bf80 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1bf90 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1bfa0 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1bfb0 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1bfc0 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1bfd0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1bfe0 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1bff0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1c000 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1c010 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1c020 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1c030 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1c040 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1c050 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1c060 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1c070 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1c080 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1c090 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1c0a0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1c0b0 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1c0c0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1c0d0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1c0e0 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1c0f0 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1c100 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1c110 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1c120 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1c130 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1c140 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1c150 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1c160 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1c170 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1c180 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1c190 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1c1a0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1c1b0 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1c1c0 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1c1d0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1c1e0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1c1f0 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1c200 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1c210 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1c220 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1c230 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1c240 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1c250 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1c260 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1c270 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1c280 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1c290 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1c2a0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1c2b0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1c2c0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1c2d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1c2e0 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1c2f0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1c300 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1c310 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1c320 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1c330 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1c340 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1c350 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1c360 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1c370 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1c380 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1c390 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1c3a0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1c3b0 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1c3c0 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1c3d0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1c3e0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1c3f0 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1c400 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1c410 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1c420 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1c430 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1c440 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1c450 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1c460 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1c470 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1c480 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1c490 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1c4a0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1c4b0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1c4c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1c4d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c4e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1c4f0 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1c500 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c510 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1c520 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1c530 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1c540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1c550 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1c560 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1c570 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1c580 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1c590 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1c5a0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1c5b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1c5c0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1c5d0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1c5e0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1c5f0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1c600 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1c610 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1c620 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1c630 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1c640 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1c650 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1c660 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1c670 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1c680 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1c690 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1c6a0 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1c6b0 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1c6c0 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b  .  int nPlayback
1c6d0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
1c6e0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1c6f0 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72  ages restored fr
1c700 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  om journal */.  
1c710 75 33 32 20 73 61 76 65 64 50 61 67 65 53 69 7a  u32 savedPageSiz
1c720 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
1c730 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Size;..  /* Figu
1c740 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1c750 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1c760 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1c770 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1c780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1c790 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1c7a0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1c7b0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1c7c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1c7d0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1c7e0 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1c7f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c800 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1c810 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1c820 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1c830 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1c840 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1c850 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1c860 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1c870 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1c880 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1c890 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1c8a0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1c8b0 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1c8c0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1c8d0 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1c8e0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1c8f0 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1c900 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1c910 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1c920 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1c930 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1c940 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1c950 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1c960 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1c970 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1c980 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1c990 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1c9a0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1c9b0 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1c9c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1c9d0 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1c9e0 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61  c,.  ** mxPathna
1c9f0 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1ca00 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1ca10 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1ca20 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1ca30 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1ca40 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1ca50 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1ca60 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1ca70 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1ca80 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1ca90 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1caa0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1cab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cac0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1cad0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1cae0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1caf0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1cb00 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1cb10 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1cb20 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1cb30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cb40 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1cb50 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1cb60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1cb70 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1cb80 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1cb90 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1cba0 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1cbb0 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1cbc0 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1cbd0 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1cbe0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1cbf0 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1cc00 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1cc10 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1cc20 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1cc30 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1cc40 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1cc50 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1cc60 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1cc70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1cc80 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1cc90 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1cca0 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1ccb0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1ccc0 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1ccd0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1cce0 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1ccf0 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1cd00 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1cd10 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1cd20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1cd30 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1cd40 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1cd50 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1cd60 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1cd70 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1cd80 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1cd90 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1cda0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cdb0 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1cdc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1cdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cde0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cdf0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1ce00 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1ce10 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1ce20 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1ce30 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1ce40 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1ce50 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1ce60 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1ce70 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1ce80 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1ce90 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1cea0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1ceb0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1cec0 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1ced0 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1cee0 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1cef0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1cf00 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1cf10 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1cf20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1cf30 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1cf40 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1cf50 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1cf60 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1cf70 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1cf80 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1cf90 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1cfa0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1cfb0 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1cfc0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1cfd0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1cfe0 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1cff0 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1d000 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1d010 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1d020 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1d030 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1d040 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1d050 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1d060 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1d070 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1d080 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1d090 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1d0a0 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1d0b0 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1d0c0 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1d0d0 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1d0e0 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1d0f0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1d100 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1d110 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1d120 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1d130 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1d140 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1d150 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1d160 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1d170 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1d180 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1d190 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1d1a0 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1d1b0 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1d1c0 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1d1d0 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1d1e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1d1f0 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1d200 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1d210 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1d220 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1d230 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1d240 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1d250 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1d260 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1d270 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1d280 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1d290 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1d2a0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1d2b0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1d2c0 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1d2d0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1d2e0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1d2f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1d300 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d310 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1d320 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1d330 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1d340 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1d350 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1d360 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1d370 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1d380 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1d390 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1d3a0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1d3b0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1d3c0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1d3d0 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1d3e0 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1d3f0 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1d400 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1d410 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1d420 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1d430 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1d440 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1d450 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1d460 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1d470 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1d480 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1d490 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1d4a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1d4c0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1d4d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d4e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d4f0 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1d500 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1d510 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1d520 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1d530 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1d540 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d550 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1d560 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1d570 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1d580 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1d590 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1d5a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1d5b0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1d5c0 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1d5d0 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1d5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1d5f0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1d600 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1d610 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1d620 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1d630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1d650 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1d660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d680 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1d690 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1d6a0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1d6b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d6c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1d6d0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1d6e0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1d6f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d700 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1d710 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1d720 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1d730 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1d740 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1d750 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1d760 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1d770 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1d780 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1d790 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1d7a0 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1d7b0 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1d7c0 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1d7d0 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1d7e0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1d7f0 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1d800 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1d810 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1d820 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1d830 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1d840 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1d850 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1d860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d870 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1d880 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1d890 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d8a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1d8b0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1d8c0 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1d8d0 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1d8e0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1d8f0 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1d900 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1d910 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1d920 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1d930 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1d940 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1d950 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1d960 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1d970 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1d980 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1d990 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1d9a0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1d9b0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1d9c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1d9d0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d9e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1d9f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1da00 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1da10 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1da20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1da30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1da40 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1da50 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
1da60 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
1da70 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20 2d 31  avedPageSize, -1
1da80 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f 6c 6c  );.  }.  /* Foll
1da90 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
1daa0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1dab0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
1dac0 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
1dad0 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
1dae0 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
1daf0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
1db00 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
1db10 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
1db20 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1db30 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
1db40 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
1db50 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
1db60 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
1db70 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1db80 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
1db90 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1dba0 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65  E_DEBUG.  sqlite
1dbb0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
1dbc0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  nt(pPager->fd,SQ
1dbd0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1dbe0 43 48 41 4e 47 45 44 2c 30 29 3b 0a 23 65 6e 64  CHANGED,0);.#end
1dbf0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  if..  /* If this
1dc00 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
1dc10 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
1dc20 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
1dc30 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
1dc40 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
1dc50 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
1dc60 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
1dc70 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
1dc80 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
1dc90 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
1dca0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
1dcb0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
1dcc0 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
1dcd0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
1dce0 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
1dcf0 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
1dd00 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
1dd10 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
1dd20 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
1dd30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
1dd40 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
1dd50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
1dd60 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
1dd70 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
1dd80 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
1dd90 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
1dda0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
1ddb0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
1ddc0 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
1ddd0 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
1dde0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1ddf0 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
1de00 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
1de10 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
1de20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
1de30 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
1de40 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
1de50 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
1de60 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
1de70 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1de80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
1de90 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1dea0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
1deb0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1dec0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1ded0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1dee0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1def0 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
1df00 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1df10 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1df20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
1df30 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1df40 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1df50 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1df60 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1df70 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20  R_OPEN).  ){.   
1df80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1df90 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30  erSync(pPager, 0
1dfa0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1dfb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dfc0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1dfd0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1dfe0 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
1dff0 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74  ='\0', 0);.    t
1e000 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1e010 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1e020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e030 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1e040 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a  && res ){.    /*
1e050 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
1e060 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
1e070 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
1e080 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
1e090 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
1e0a0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
1e0b0 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
1e0c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
1e0d0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1e0e0 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
1e0f0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1e100 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1e110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1e120 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74  .  }.  if( isHot
1e130 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b   && nPlayback ){
1e140 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
1e150 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  (SQLITE_NOTICE_R
1e160 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c  ECOVER_ROLLBACK,
1e170 20 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70   "recovered %d p
1e180 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20  ages from %s",. 
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1e1a0 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72  Playback, pPager
1e1b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  ->zJournal);.  }
1e1c0 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
1e1d0 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1e1e0 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
1e1f0 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
1e200 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
1e210 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
1e220 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1e230 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
1e240 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
1e250 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
1e260 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
1e270 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
1e280 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
1e290 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1e2a0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1e2b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1e2c0 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1e2d0 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75   for page pPg ou
1e2e0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1e2f0 65 20 66 69 6c 65 20 28 6f 72 20 6f 75 74 20 6f  e file (or out o
1e300 66 0a 2a 2a 20 74 68 65 20 57 41 4c 20 69 66 20  f.** the WAL if 
1e310 74 68 61 74 20 69 73 20 77 68 65 72 65 20 74 68  that is where th
1e320 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
1e330 70 79 20 69 66 20 66 6f 75 6e 64 29 20 69 6e 74  py if found) int
1e340 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1e350 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1e360 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1e370 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1e380 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1e390 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1e3a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1e3b0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1e3c0 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1e3d0 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1e3e0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1e3f0 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1e400 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1e410 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1e430 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1e440 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1e450 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1e460 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1e470 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1e480 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1e490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1e4a0 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1e4b0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1e4c0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1e4d0 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
1e4e0 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1e4f0 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
1e500 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1e510 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1e520 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1e530 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1e540 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 75 33  TE_OMIT_WAL.  u3
1e550 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
1e560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
1e570 61 6d 65 20 6f 66 20 57 41 4c 20 63 6f 6e 74 61  ame of WAL conta
1e580 69 6e 69 6e 67 20 70 67 6e 6f 20 2a 2f 0a 0a 20  ining pgno */.. 
1e590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e5a0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1e5b0 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1e5c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1e5d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1e5e0 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
1e5f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1e600 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e610 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
1e620 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d  ager->pWal, pPg-
1e630 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b  >pgno, &iFrame);
1e640 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1e650 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
1e660 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20  f( iFrame ){.   
1e670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1e680 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72  ReadFrame(pPager
1e690 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 70  ->pWal, iFrame,p
1e6a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1e6b0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pPg->pData);.  }
1e6c0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
1e6d0 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1e6e0 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  = (pPg->pgno-1)*
1e6f0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1e700 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1e710 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1e720 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1e730 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
1e740 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29  geSize, iOffset)
1e750 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1e760 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1e770 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1e780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e790 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1e7a0 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  pPg->pgno==1 ){.
1e7b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e7c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
1e7d0 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66  ad is unsuccessf
1e7e0 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69  ul, set the dbFi
1e7f0 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65  leVers[] to some
1e800 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  thing.      ** t
1e810 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
1e820 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76  e a valid file v
1e830 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56  ersion.  dbFileV
1e840 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a  ers[] is a copy.
1e850 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65        ** of byte
1e860 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  s 24..39 of the 
1e870 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73  database.  Bytes
1e880 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61   28..31 should a
1e890 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a  lways be.      *
1e8a0 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69  * zero or the si
1e8b0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e8c0 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65  se in page. Byte
1e8d0 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
1e8e0 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  .39.      ** sho
1e8f0 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62  uld be page numb
1e900 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65  ers which are ne
1e910 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
1e920 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20   So filling.    
1e930 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46    ** pPager->dbF
1e940 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61  ileVers[] with a
1e950 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68  ll 0xff bytes sh
1e960 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
1e970 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1e980 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
1e990 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
1e9a0 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
1e9b0 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
1e9c0 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
1e9d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e9e0 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
1e9f0 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
1ea00 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
1ea10 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65  ** white noise e
1ea20 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73  qualing 16 bytes
1ea30 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69   of 0xff is vani
1ea40 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f  shingly small so
1ea50 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f  .      ** we sho
1ea60 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e  uld still be ok.
1ea70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ea80 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64  memset(pPager->d
1ea90 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c  bFileVers, 0xff,
1eaa0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1eab0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1eac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
1ead0 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
1eae0 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
1eaf0 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65  a)[24];.      me
1eb00 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1eb10 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
1eb20 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
1eb30 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1eb40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43  );.    }.  }.  C
1eb50 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
1eb60 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  g->pData, pPg->p
1eb70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
1eb80 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
1eb90 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1eba0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1ebb0 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1ebc0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1ebd0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1ebe0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1ebf0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1ec00 3e 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52  >pgno));.  PAGER
1ec10 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1ec20 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1ec30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1ec40 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1ec50 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1ec60 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1ec70 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1ec80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ec90 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1eca0 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1ecb0 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1ecc0 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1ecd0 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1ece0 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1ecf0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1ed00 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1ed10 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1ed20 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1ed30 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1ed40 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1ed50 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1ed60 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1ed70 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1ed80 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1ed90 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1eda0 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1edb0 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1edc0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1edd0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1ede0 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1edf0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1ee00 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1ee10 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1ee20 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1ee30 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1ee40 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1ee50 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1ee60 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1ee70 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1ee80 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1ee90 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1eea0 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1eeb0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1eec0 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1eed0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1eee0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1eef0 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1ef00 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1ef10 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1ef20 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1ef30 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1ef40 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1ef50 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1ef60 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1ef70 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1ef80 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1ef90 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1efa0 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1efb0 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1efc0 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1efd0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1efe0 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1eff0 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1f000 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1f010 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1f020 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f030 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1f040 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1f050 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1f060 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1f070 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1f080 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1f090 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1f0a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1f0b0 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1f0c0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1f0d0 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1f0e0 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1f0f0 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1f100 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1f110 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1f120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1f130 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1f140 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1f150 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1f160 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1f170 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1f180 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1f190 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1f1a0 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1f1b0 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1f1c0 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1f1d0 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1f1e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1f1f0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1f200 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1f210 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1f220 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1f230 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1f240 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1f250 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1f260 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1f270 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1f280 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1f290 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1f2a0 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1f2b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f2c0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1f2d0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1f2e0 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1f2f0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1f300 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1f310 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1f320 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1f330 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1f340 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1f350 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1f360 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1f370 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1f380 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1f390 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1f3a0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1f3b0 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
1f3c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f3d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f3e0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1f3f0 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
1f400 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f410 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
1f420 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
1f430 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69    /* Normally, i
1f440 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1f450 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1f460 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65  any backup proce
1f470 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70  sses are.  ** up
1f480 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73  dated as data is
1f490 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
1f4a0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1f4b0 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65  nal and into the
1f4c0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
1f4d0 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65  This is not gene
1f4e0 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77  rally possible w
1f4f0 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61  ith a WAL databa
1f500 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c  se, as.  ** roll
1f510 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69  back involves si
1f520 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20  mply truncating 
1f530 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68  the log file. Th
1f540 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a  erefore, if one.
1f550 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61    ** or more fra
1f560 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
1f570 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1f580 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68   the log (and th
1f590 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c  erefore .  ** al
1f5a0 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  so copied into t
1f5b0 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61  he backup databa
1f5c0 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20  ses) as part of 
1f5d0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1f5e0 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75  ,.  ** the backu
1f5f0 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61  ps must be resta
1f600 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rted..  */.  sql
1f610 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
1f620 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
1f630 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  p);..  return rc
1f640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f650 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f660 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ed to rollback a
1f670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1f680 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a  a WAL database..
1f690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f6a0 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50  gerRollbackWal(P
1f6b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f6c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1f6f0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1f700 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f710 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f720 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72  dirty pages to r
1f730 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46  evert */..  /* F
1f740 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  or all pages in 
1f750 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61  the cache that a
1f760 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  re currently dir
1f770 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61  ty or have alrea
1f780 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69  dy.  ** been wri
1f790 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f  tten (but not co
1f7a0 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20  mmitted) to the 
1f7b0 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65  log file, do one
1f7c0 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f   of the .  ** fo
1f7d0 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20  llowing:.  **.  
1f7e0 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74  **   + Discard t
1f7f0 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28  he cached page (
1f800 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c  if refcount==0),
1f810 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c   or.  **   + Rel
1f820 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
1f830 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f840 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e  se (if refcount>
1f850 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  0)..  */.  pPage
1f860 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1f870 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1f880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f890 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  lUndo(pPager->pW
1f8a0 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  al, pagerUndoCal
1f8b0 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70  lback, (void *)p
1f8c0 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20  Pager);.  pList 
1f8d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f8e0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f8f0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69  >pPCache);.  whi
1f900 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d  le( pList && rc=
1f910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f920 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
1f930 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1f940 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
1f950 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64  doCallback((void
1f960 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74   *)pPager, pList
1f970 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69  ->pgno);.    pLi
1f980 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a  st = pNext;.  }.
1f990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f9a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f9b0 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65  tion is a wrappe
1f9c0 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
1f9d0 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20  WalFrames(). As 
1f9e0 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a  well as logging.
1f9f0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
1fa00 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  of the list of p
1fa10 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70  ages headed by p
1fa20 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20  List (connected 
1fa30 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74  by pDirty),.** t
1fa40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74  his function not
1fa50 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65  ifies any active
1fa60 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1fa70 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73  s that the pages
1fa80 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64   have.** changed
1fa90 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73  . .**.** The lis
1faa0 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73 65  t of pages passe
1fab0 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
1fac0 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f  ine is always so
1fad0 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d  rted by page num
1fae0 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69  ber..** Hence, i
1faf0 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72 73  f page 1 appears
1fb00 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
1fb10 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62   list, it will b
1fb20 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1fb30 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
1fb40 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
1fb50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1fb60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fb70 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1fb80 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ct */.  PgHdr *p
1fb90 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
1fba0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1fbb0 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67  of frames to log
1fbc0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e   */.  Pgno nTrun
1fbd0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1fbe0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1fbf0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69  e size after thi
1fc00 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  s commit */.  in
1fc10 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fc30 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1fc40 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a   a commit */.){.
1fc50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1fc80 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b   */.  int nList;
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1fcb0 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73  of pages in pLis
1fcc0 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b  t */.  PgHdr *p;
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1fcf0 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73  oping over pages
1fd00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1fd10 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20  Pager->pWal );. 
1fd20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1fd30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1fd40 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
1fd50 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
1fd60 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e  list is in accen
1fd70 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
1fd80 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26  for(p=pList; p &
1fd90 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70  & p->pDirty; p=p
1fda0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61  ->pDirty){.    a
1fdb0 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c  ssert( p->pgno <
1fdc0 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f   p->pDirty->pgno
1fdd0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1fde0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1fdf0 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73  >pDirty==0 || is
1fe00 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20  Commit );.  if( 
1fe10 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
1fe20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e  /* If a WAL tran
1fe30 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
1fe40 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72   committed, ther
1fe50 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1fe60 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
1fe70 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70  any pages with p
1fe80 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1fe90 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61  ter than nTrunca
1fea0 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20  te into the WAL 
1feb0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  file..    ** The
1fec0 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
1fed0 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65  read by any clie
1fee0 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68  nt. So remove th
1fef0 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72  em from the pDir
1ff00 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68  ty.    ** list h
1ff10 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64  ere. */.    PgHd
1ff20 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1ff30 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  ist;.    nList =
1ff40 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   0;.    for(p=pL
1ff50 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1ff60 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72  p)!=0; p=p->pDir
1ff70 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ty){.      if( p
1ff80 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74  ->pgno<=nTruncat
1ff90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e  e ){.        ppN
1ffa0 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1ffb0 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b  ;.        nList+
1ffc0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1ffd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1ffe0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1fff0 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
20000 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
20010 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
20020 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
20030 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
20040 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
20050 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
20060 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
20070 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
20080 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
20090 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
200a0 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
200b0 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
200c0 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
200d0 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
200e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
200f0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
20100 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  kup ){.    for(p
20110 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
20120 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73  pDirty){.      s
20130 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
20140 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
20150 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38  up, p->pgno, (u8
20160 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20   *)p->pData);.  
20170 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
20180 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
20190 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  ES.  pList = sql
201a0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
201b0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
201c0 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c  che);.  for(p=pL
201d0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
201e0 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  rty){.    pager_
201f0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b  set_pagehash(p);
20200 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
20210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20220 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
20230 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
20240 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
20250 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
20260 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
20270 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
20280 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
20290 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
202a0 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
202b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
202c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
202d0 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
202e0 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
202f0 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
20300 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
20310 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
20320 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
20330 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
20340 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
20350 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
20360 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
20370 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
20380 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20390 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
203c0 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
203d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
203e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
203f0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
20400 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
20410 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
20420 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
20430 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20440 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
20450 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20460 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
20470 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61  ..  /* sqlite3Wa
20480 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
20490 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ion() was not ca
204a0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65  lled for the pre
204b0 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73  vious.  ** trans
204c0 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e  action in lockin
204d0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
204e0 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f  .  So call it no
204f0 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61  w.  If we.  ** a
20500 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  re in locking_mo
20510 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e  de=NORMAL and En
20520 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76  dRead() was prev
20530 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20  iously called,. 
20540 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74   ** the duplicat
20550 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65  e call is harmle
20560 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
20570 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
20580 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
20590 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pWal);..  rc = s
205a0 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65  qlite3WalBeginRe
205b0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
205c0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61  ager->pWal, &cha
205d0 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21  nged);.  if( rc!
205e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68  =SQLITE_OK || ch
205f0 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67  anged ){.    pag
20600 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
20610 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
20620 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
20630 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
20640 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
20650 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20660 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
20670 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20680 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
20690 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
206a0 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
206b0 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
206c0 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
206d0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
206e0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
206f0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
20700 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
20710 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
20720 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
20730 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
20740 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
20750 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
20760 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20770 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
20780 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
20790 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
207a0 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
207b0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
207c0 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
207d0 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
207e0 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
207f0 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
20800 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
20810 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
20820 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
20830 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
20840 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
20850 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
20880 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
20890 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
208a0 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
208b0 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
208c0 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
208d0 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
208e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
208f0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
20900 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
20910 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
20920 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
20930 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
20940 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
20950 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
20960 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
20970 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
20980 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
20990 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
209a0 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
209b0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
209c0 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
209d0 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
209e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
209f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
20a00 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
20a10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
20a20 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
20a30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
20a40 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
20a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20a60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
20a70 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
20a80 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
20a90 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
20aa0 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  /* If the number
20ab0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
20ac0 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
20ad0 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
20ae0 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62  the.  ** WAL sub
20af0 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69  -system, determi
20b00 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e  ne the page coun
20b10 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
20b20 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ize of.  ** the 
20b30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
20b40 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  If the size of t
20b50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20b60 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20   is not an.  ** 
20b70 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
20b80 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
20b90 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20  e, round up the 
20ba0 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
20bb0 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41  f( nPage==0 && A
20bc0 4c 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61  LWAYS(isOpen(pPa
20bd0 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20  ger->fd)) ){.   
20be0 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c00 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
20c10 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
20c20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
20c30 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
20c40 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
20c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
20c70 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
20c80 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29    nPage = (Pgno)
20c90 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  ((n+pPager->page
20ca0 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72  Size-1) / pPager
20cb0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
20cc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
20cd0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
20ce0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
20cf0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
20d00 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  n the.  ** confi
20d10 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
20d20 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
20d30 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
20d40 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
20d50 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
20d60 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
20d70 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
20d80 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
20d90 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
20da0 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
20db0 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   }..  *pnPage = 
20dc0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
20dd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
20de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20df0 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63  T_WAL./*.** Chec
20e00 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
20e10 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
20e20 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
20e30 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
20e40 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20  Pager.** exists 
20e50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
20e60 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20  is not empy, or 
20e70 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
20e80 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  *-wal file does.
20e90 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79  ** not exist (by
20ea0 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66   deleting it) if
20eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20ec0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
20ed0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
20ee0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  se is not empty 
20ef0 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  and the *-wal fi
20f00 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20  le exists, open 
20f10 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20  the pager.** in 
20f20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68  WAL mode.  If th
20f30 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
20f40 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77  pty or if no *-w
20f50 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
20f60 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f  nd.** if no erro
20f70 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73  r occurs, make s
20f80 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ure Pager.journa
20f90 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74  lMode is not set
20fa0 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55   to.** PAGER_JOU
20fb0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a  RNALMODE_WAL..**
20fc0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
20fd0 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72  E_OK or an error
20fe0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
20ff0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c   caller must hol
21000 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  d a SHARED lock 
21010 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21020 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  file to call thi
21030 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42  s.** function. B
21040 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53  ecause an EXCLUS
21050 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
21060 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  db file is requi
21070 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a  red to delete .*
21080 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e  * a WAL on a non
21090 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  e-empty database
210a0 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
210b0 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
210c0 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65  condition .** be
210d0 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73  tween the xAcces
210e0 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  s() below and an
210f0 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
21100 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
21110 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e  e .** other conn
21120 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
21130 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57  c int pagerOpenW
21140 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65  alIfPresent(Page
21150 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21160 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21180 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
21190 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
211a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
211b0 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
211c0 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
211d0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
211e0 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66  /* True if WAL f
21210 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
21220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21230 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
21240 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
21250 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
21260 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
21270 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a  , &isWal.    );.
21280 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
212a0 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
212b0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
212e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
212f0 2f 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  /..        rc = 
21300 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
21310 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21320 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
21330 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21340 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
21350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
21360 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
21370 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
21380 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
21390 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
213a0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
213b0 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
213c0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
213d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
213e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
213f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
21400 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
21410 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21420 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
21430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
21440 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
21450 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
21460 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21470 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
21480 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
21490 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
214a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
214b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
214c0 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
214d0 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
214e0 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
214f0 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
21500 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
21510 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
21520 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
21530 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
21540 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
21550 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
21560 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
21570 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
21580 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
21590 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
215a0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
215b0 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
215c0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
215d0 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
215e0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
215f0 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
21600 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
21610 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
21620 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
21630 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
21640 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
21650 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
21660 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
21670 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
21680 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
21690 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
216a0 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
216b0 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
216c0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
216d0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
216e0 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
216f0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
21700 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
21710 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
21720 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
21730 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
21740 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
21750 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
21760 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
21770 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
21780 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
21790 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
217a0 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
217b0 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
217c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
217d0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
217e0 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
217f0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
21800 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
21810 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
21820 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
21830 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
21840 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
21850 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
21860 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
21870 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
21880 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
21890 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
218a0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
218b0 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
218c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
218d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
218e0 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
218f0 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
21900 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
21910 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
21920 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
21930 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
21940 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
21950 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
21960 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
21970 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
21980 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
21990 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
219a0 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
219b0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
219c0 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
219d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
219e0 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
219f0 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
21a00 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
21a10 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
21a20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
21a30 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
21a40 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
21a50 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
21a60 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
21a70 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
21a80 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
21a90 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
21aa0 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
21ab0 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
21ac0 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
21ad0 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
21ae0 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
21af0 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
21b00 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
21b10 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
21b20 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
21b30 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
21b40 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
21b50 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
21b60 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
21b70 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
21b80 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
21b90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21ba0 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
21bb0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
21bc0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
21bd0 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
21be0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
21bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
21c00 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
21c10 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
21c20 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c40 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
21c50 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
21c60 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
21c70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21c80 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
21c90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
21ca0 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
21cb0 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
21cc0 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
21cd0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
21ce0 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
21cf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21d00 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
21d10 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
21d20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
21d30 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
21d40 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
21d50 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
21d60 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
21d70 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
21d80 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
21d90 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
21da0 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
21db0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
21dc0 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
21dd0 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
21de0 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
21df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
21e00 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
21e10 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
21e20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
21e30 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
21e40 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
21e50 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
21e60 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
21e70 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
21e80 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
21e90 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
21ea0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
21eb0 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
21ec0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
21ed0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
21ee0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
21ef0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
21f00 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
21f10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21f20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
21f30 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
21f40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
21f50 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
21f60 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
21f70 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
21f80 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
21f90 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
21fa0 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
21fb0 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
21fc0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
21fd0 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
21fe0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
21ff0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
22000 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
22010 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
22020 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
22030 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
22040 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
22050 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
22060 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
22070 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
22080 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
22090 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
220a0 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
220b0 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
220c0 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
220d0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
220e0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
220f0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
22100 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
22110 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
22120 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
22130 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
22140 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
22150 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
22160 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
22170 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
22180 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
22190 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
221a0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
221b0 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
221c0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
221d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
221e0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
221f0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
22200 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
22210 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
22220 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
22230 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
22240 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
22250 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
22260 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
22270 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
22280 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
22290 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
222a0 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
222b0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
222c0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
222d0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
222e0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
222f0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
22300 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
22310 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
22320 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
22330 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
22340 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22350 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22360 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
22370 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
22380 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
22390 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
223a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
223b0 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
223c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
223d0 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
223e0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
223f0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
22400 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
22410 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
22420 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
22430 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
22440 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
22450 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
22460 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
22470 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
22480 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
22490 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
224a0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
224b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
224c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
224d0 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
224e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
224f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
22500 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
22510 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
22520 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
22530 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
22540 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
22550 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
22560 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
22570 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
22580 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22590 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
225a0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
225b0 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
225c0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
225d0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
225e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
225f0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
22600 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
22610 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
22620 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
22630 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
22640 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
22650 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
22660 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
22670 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
22680 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
22690 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
226a0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
226b0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
226c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
226d0 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
226e0 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
226f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22700 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
22710 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
22720 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
22730 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22740 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
22750 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22760 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
22770 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
22780 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
22790 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
227a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
227b0 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
227c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
227d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
227e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
227f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
22800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22810 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
22820 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
22830 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
22840 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
22850 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
22860 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
22870 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
22880 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
22890 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
228a0 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
228b0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
228c0 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
228d0 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
228e0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
228f0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
22900 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
22910 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22920 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
22930 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
22940 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  )pSavepoint->iSu
22950 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
22960 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
22970 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
22980 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
22990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
229a0 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50  SavepointUndo(pP
229b0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76  ager->pWal, pSav
229c0 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61  epoint->aWalData
229d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
229e0 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
229f0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
22a00 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
22a10 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
22a20 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
22a30 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29  t( offset==(i64)
22a40 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
22a50 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
22a60 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
22a70 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
22a80 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
22a90 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
22aa0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
22ab0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
22ac0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
22ad0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
22ae0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
22af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22b00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22b10 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
22b20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22b30 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
22b40 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
22b50 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
22b60 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
22b70 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74  wed.** before at
22b80 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79  tempting to recy
22b90 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e  cle clean and un
22ba0 75 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76  used pages..*/.v
22bb0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
22bc0 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
22bd0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
22be0 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
22bf0 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
22c00 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
22c10 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
22c20 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
22c30 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
22c40 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
22c50 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
22c60 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  lowed.** before 
22c70 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70  attempting to sp
22c80 69 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75  ill pages to jou
22c90 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
22ca0 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c  ite3PagerSetSpil
22cb0 6c 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  lsize(Pager *pPa
22cc0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
22cd0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
22ce0 65 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c  e3PcacheSetSpill
22cf0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
22d00 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
22d10 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53  ../*.** Invoke S
22d20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
22d30 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74  _SIZE based on t
22d40 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
22d50 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73   of szMmap..*/.s
22d60 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
22d70 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65  FixMaplimit(Page
22d80 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20  r *pPager){.#if 
22d90 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
22da0 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33  SIZE>0.  sqlite3
22db0 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
22dc0 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73  er->fd;.  if( is
22dd0 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e  Open(fd) && fd->
22de0 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
22df0 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c  on>=3 ){.    sql
22e00 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20  ite3_int64 sz;. 
22e10 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e     sz = pPager->
22e20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67  szMmap;.    pPag
22e30 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20  er->bUseFetch = 
22e40 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47  (sz>0);.    setG
22e50 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67  etterMethod(pPag
22e60 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
22e70 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
22e80 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
22e90 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
22ea0 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a  SIZE, &sz);.  }.
22eb0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
22ec0 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
22ed0 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d  um size of any m
22ee0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
22ef0 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
22f00 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
22f10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22f20 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20  MmapLimit(Pager 
22f30 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
22f40 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
22f50 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70    pPager->szMmap
22f60 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67   = szMmap;.  pag
22f70 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
22f80 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
22f90 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  Free as much mem
22fa0 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
22fb0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a  from the pager..
22fc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
22fd0 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72  agerShrink(Pager
22fe0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
22ff0 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b  ite3PcacheShrink
23000 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23010 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
23020 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74  st settings of t
23030 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73  he pager to thos
23040 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
23050 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d  he pgFlags param
23060 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
23070 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61  "level" in pgFla
23080 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
23090 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73  RONOUS_MASK sets
230a0 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a   the robustness.
230b0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
230c0 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
230d0 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f   to OS crashes o
230e0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
230f0 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20   by.** changing 
23100 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
23110 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
23120 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73  ing the journals
23130 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66  ..** There are f
23140 6f 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  our levels:.**.*
23150 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
23160 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
23170 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
23180 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
23190 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
231a0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
231b0 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
231c0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
231d0 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
231e0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
231f0 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
23200 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
23210 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23220 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
23230 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
23240 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
23250 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
23260 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
23270 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
23280 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
23290 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
232a0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
232b0 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
232c0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
232d0 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
232e0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
232f0 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
23300 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
23310 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
23320 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
23330 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
23340 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
23350 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
23360 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
23370 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
23380 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
23390 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
233a0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
233b0 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
233c0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
233d0 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
233e0 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
233f0 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
23400 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
23410 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
23420 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
23440 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
23450 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
23460 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
23470 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
23480 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
23490 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
234a0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
234b0 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
234c0 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
234d0 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
234e0 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
234f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23500 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
23510 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
23520 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
23530 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
23540 20 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69     EXTRA     Thi
23550 73 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65  s is like FULL e
23560 78 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c  xcept that is al
23570 73 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72  so syncs the dir
23580 65 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20  ectory.**       
23590 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74         that cont
235a0 61 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63  ains the rollbac
235b0 6b 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20  k journal after 
235c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
235e0 72 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64  rnal is unlinked
235f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
23600 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
23610 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
23620 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
23630 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
23640 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
23650 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
23660 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
23670 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
23680 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
23690 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
236a0 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
236b0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
236c0 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
236d0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
236e0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
236f0 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
23700 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
23710 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
23720 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
23730 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
23740 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
23750 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
23760 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
23770 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
23780 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
23790 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
237a0 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
237b0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
237c0 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
237d0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
237e0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
237f0 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
23800 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
23810 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
23820 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
23830 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58  n FULL.** and EX
23840 54 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65  TRA for WAL mode
23850 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
23860 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
23870 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
23880 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
23890 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
238a0 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
238b0 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
238c0 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
238d0 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
238e0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
238f0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
23900 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
23910 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
23920 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
23930 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
23940 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
23950 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
23960 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
23970 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
23980 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
23990 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
239a0 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
239b0 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
239c0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
239d0 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
239e0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
239f0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
23a00 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
23a10 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
23a20 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
23a30 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
23a40 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
23a50 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
23a60 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
23a70 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
23a80 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
23a90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
23aa0 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
23ab0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
23ac0 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ags(.  Pager *pP
23ad0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
23ae0 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
23af0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
23b00 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
23b10 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  pgFlags      /* 
23b20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f  Various flags */
23b30 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
23b40 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26  evel = pgFlags &
23b50 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
23b60 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70  US_MASK;.  if( p
23b70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
23b80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
23b90 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  oSync = 1;.    p
23ba0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
23bb0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
23bc0 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
23bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
23be0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
23bf0 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43  evel==PAGER_SYNC
23c00 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30  HRONOUS_OFF ?1:0
23c10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
23c20 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d  llSync = level>=
23c30 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
23c40 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20  S_FULL ?1:0;.   
23c50 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
23c60 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45  nc = level==PAGE
23c70 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58  R_SYNCHRONOUS_EX
23c80 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  TRA ?1:0;.  }.  
23c90 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
23ca0 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
23cb0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ->syncFlags = 0;
23cc0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
23cd0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c  lags & PAGER_FUL
23ce0 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
23cf0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
23d00 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
23d10 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
23d20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
23d30 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
23d40 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
23d50 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
23d60 61 67 73 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  ags = (pPager->s
23d70 79 6e 63 46 6c 61 67 73 3c 3c 32 29 3b 0a 20 20  yncFlags<<2);.  
23d80 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
23d90 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
23da0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
23db0 20 7c 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63   |= pPager->sync
23dc0 46 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28  Flags;.  }.  if(
23dd0 20 28 70 67 46 6c 61 67 73 20 26 20 50 41 47 45   (pgFlags & PAGE
23de0 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43  R_CKPT_FULLFSYNC
23df0 29 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ) && !pPager->no
23e00 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
23e10 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
23e20 20 7c 3d 20 28 53 51 4c 49 54 45 5f 53 59 4e 43   |= (SQLITE_SYNC
23e30 5f 46 55 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20  _FULL<<2);.  }. 
23e40 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
23e50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20  AGER_CACHESPILL 
23e60 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
23e70 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
23e80 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
23e90 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23ea0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
23eb0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
23ec0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
23ed0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23ee0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23ef0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
23f00 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
23f10 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
23f20 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
23f30 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
23f40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
23f50 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
23f60 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
23f70 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
23f80 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
23f90 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
23fa0 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
23fb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
23fc0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
23fd0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
23fe0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
23ff0 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
24000 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24010 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
24020 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
24030 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
24040 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
24050 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
24060 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
24070 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
24080 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
24090 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
240a0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
240b0 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
240c0 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
240d0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
240e0 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
240f0 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
24100 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
24110 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
24120 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
24130 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
24140 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
24150 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
24160 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
24170 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
24180 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
24190 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
241a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
241b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
241c0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
241d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
241e0 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
241f0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
24200 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
24210 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
24220 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
24230 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
24240 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
24250 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24260 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24270 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
24280 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
24290 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
242a0 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
242b0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
242c0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
242d0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
242e0 6c 61 67 73 20 7c 3d 20 20 0a 23 69 66 20 53 51  lags |=  .#if SQ
242f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
24300 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
24310 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
24320 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  >vfsFlags&SQLITE
24330 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43  _OPEN_FILEPROTEC
24340 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64  TION_MASK)|.#end
24350 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  if.            S
24360 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
24370 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
24380 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
24390 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
243a0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
243b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
243c0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
243d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
243e0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
243f0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
24400 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
24410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
24420 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
24430 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24440 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
24450 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
24460 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
24470 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
24480 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
24490 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
244a0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
244b0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
244c0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
244d0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
244e0 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
244f0 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
24500 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
24510 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
24520 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
24530 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
24540 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
24550 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
24560 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
24570 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
24580 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
24590 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
245a0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
245b0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
245c0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
245d0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
245e0 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
245f0 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
24600 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
24610 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
24620 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
24630 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
24640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
24670 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
24680 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
24690 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
246a0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
246b0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
246c0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
246d0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
246e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
246f0 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
24700 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
24710 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
24720 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
24730 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
24740 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
24750 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
24760 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
24770 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
24780 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
24790 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
247a0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
247b0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
247c0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
247d0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
247e0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
247f0 73 79 48 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syHandler(.  Pag
24800 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
24830 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
24840 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
24850 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
24860 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
24870 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
24880 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
24890 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
248a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
248b0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
248c0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
248d0 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 2a 61 70 3b  .){.  void **ap;
248e0 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
248f0 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
24900 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
24910 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
24920 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
24930 41 72 67 3b 0a 20 20 61 70 20 3d 20 28 76 6f 69  Arg;.  ap = (voi
24940 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42  d **)&pPager->xB
24950 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 61 73  usyHandler;.  as
24960 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76  sert( ((int(*)(v
24970 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d  oid *))(ap[0]))=
24980 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b  =xBusyHandler );
24990 0a 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d  .  assert( ap[1]
249a0 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
249b0 67 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  g );.  sqlite3Os
249c0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
249d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
249e0 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
249f0 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
24a00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
24a10 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
24a20 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
24a30 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
24a40 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
24a50 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
24a60 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
24a70 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
24a80 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
24a90 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
24aa0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
24ab0 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
24ac0 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
24ad0 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
24ae0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
24af0 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
24b00 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
24b10 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  R, an SQLITE_IOE
24b20 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20  RR_xxx sub-code 
24b30 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
24b40 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
24b50 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
24b60 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
24b70 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
24b80 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
24b90 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
24ba0 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
24bb0 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
24bc0 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
24bd0 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
24be0 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
24bf0 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
24c00 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
24c10 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
24c20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
24c30 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
24c40 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
24c50 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
24c60 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
24c70 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
24c80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
24c90 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
24ca0 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
24cb0 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
24cc0 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
24cd0 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
24ce0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
24cf0 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
24d00 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
24d10 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
24d20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
24d30 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
24d40 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
24d50 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
24d60 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
24d70 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
24d80 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24d90 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
24da0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
24db0 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
24dc0 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
24dd0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
24de0 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
24df0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24e00 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
24e10 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
24e20 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
24e30 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
24e40 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
24e50 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
24e60 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
24e70 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
24e80 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
24e90 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
24ea0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
24eb0 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
24ec0 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
24ed0 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
24ee0 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
24ef0 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
24f00 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
24f10 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
24f20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
24f30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24f40 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
24f50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
24f60 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  32 *pPageSize, i
24f70 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
24f80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24f90 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  OK;..  /* It is 
24fa0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
24fb0 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74  do a full assert
24fc0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68  _pager_state() h
24fd0 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a  ere, as this.  *
24fe0 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  * function may b
24ff0 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
25000 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29  thin PagerOpen()
25010 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61  , before the sta
25020 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50  te.  ** of the P
25030 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69  ager object is i
25040 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73  nternally consis
25050 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tent..  **.  ** 
25060 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69  At one point thi
25070 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
25080 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ned an error if 
25090 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
250a0 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52   .  ** PAGER_ERR
250b0 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69  OR state. But si
250c0 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20  nce PAGER_ERROR 
250d0 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73  state guarantees
250e0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65   that.  ** there
250f0 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   is at least one
25100 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
25110 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69  e reference, thi
25120 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
25130 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
25140 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e  hat case anyhow.
25150 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67  .  */..  u32 pag
25160 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
25170 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ze;.  assert( pa
25180 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
25190 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
251a0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
251b0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
251c0 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
251d0 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
251e0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
251f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
25200 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
25210 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
25220 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20  .   && pageSize 
25230 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33  && pageSize!=(u3
25240 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
25250 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  ze .  ){.    cha
25260 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20  r *pNew = NULL; 
25270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25280 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f  ew temp space */
25290 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d  .    i64 nByte =
252a0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   0;..    if( pPa
252b0 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45  ger->eState>PAGE
252c0 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e  R_OPEN && isOpen
252d0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
252e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
252f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
25300 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29  ger->fd, &nByte)
25310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25330 0a 20 20 20 20 20 20 2f 2a 20 38 20 62 79 74 65  .      /* 8 byte
25340 73 20 6f 66 20 7a 65 72 6f 65 64 20 6f 76 65 72  s of zeroed over
25350 72 75 6e 20 73 70 61 63 65 20 69 73 20 73 75 66  run space is suf
25360 66 69 63 69 65 6e 74 20 73 6f 20 74 68 61 74 20  ficient so that 
25370 74 68 65 20 62 2d 74 72 65 65 0a 20 20 20 20 20  the b-tree.     
25380 20 2a 20 63 65 6c 6c 20 68 65 61 64 65 72 20 70   * cell header p
25390 61 72 73 65 72 20 77 69 6c 6c 20 6e 65 76 65 72  arser will never
253a0 20 72 75 6e 20 6f 66 66 20 74 68 65 20 65 6e 64   run off the end
253b0 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
253c0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  on */.      pNew
253d0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
253e0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
253f0 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 20 20  eSize+8);.      
25400 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
25410 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25420 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
25430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25440 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2b 70 61    memset(pNew+pa
25450 67 65 53 69 7a 65 2c 20 30 2c 20 38 29 3b 0a 20  geSize, 0, 8);. 
25460 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
25490 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
254a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
254b0 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
254c0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
254d0 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
254e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
254f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
25510 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
25520 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
25530 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
25540 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
25550 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25560 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b  = (Pgno)((nByte+
25570 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65  pageSize-1)/page
25580 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
25590 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
255a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65  pageSize;.    }e
255b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
255c0 65 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29  e3PageFree(pNew)
255d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
255e0 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
255f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
25600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25610 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
25620 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
25630 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
25640 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
25650 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
25660 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
25670 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
25680 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
25690 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
256a0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
256b0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46  ger);.    pagerF
256c0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
256d0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
256e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
256f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
25700 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
25710 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
25720 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
25730 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
25740 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
25750 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
25760 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
25770 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
25780 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
25790 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
257a0 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
257b0 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
257c0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
257d0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
257e0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
257f0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
25800 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
25810 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
25820 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
25830 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
25840 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
25850 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
25860 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
25870 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
25880 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
25890 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
258a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
258b0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
258c0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
258d0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
258e0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
258f0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
25900 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
25910 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
25920 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
25930 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
25940 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
25950 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
25960 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
25970 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
25980 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
25990 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
259a0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
259b0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
259c0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
259d0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
259e0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
259f0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
25a00 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
25a10 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
25a20 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ge;.  }.  assert
25a30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25a40 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20  !=PAGER_OPEN ); 
25a50 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f       /* Called o
25a60 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63  nly by OP_MaxPgc
25a70 6e 74 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72  nt */.  /* asser
25a80 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
25a90 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
25aa0 65 20 29 3b 20 2a 2f 0a 20 20 2f 2a 20 4f 50 5f  e ); */.  /* OP_
25ab0 4d 61 78 50 67 63 6e 74 20 65 6e 73 75 72 65 73  MaxPgcnt ensures
25ac0 20 74 68 61 74 20 74 68 65 20 70 61 72 61 6d 65   that the parame
25ad0 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  ter passed to th
25ae0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
25af0 6f 74 0a 20 20 2a 2a 20 6c 65 73 73 20 74 68 61  ot.  ** less tha
25b00 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
25b10 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
25b20 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
25b30 65 2e 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a  e. But this.  **
25b40 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61   may be less tha
25b50 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
25b60 61 6e 64 20 73 6f 20 74 68 65 20 61 73 73 65 72  and so the asser
25b70 74 28 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  t() above is not
25b80 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75   valid */.  retu
25b90 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
25ba0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
25bb0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
25bc0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
25bd0 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
25be0 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
25bf0 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
25c00 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
25c10 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
25c20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
25c30 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
25c40 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
25c50 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
25c60 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
25c70 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
25c80 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
25c90 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
25ca0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
25cb0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
25cc0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
25cd0 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
25ce0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
25cf0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
25d00 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
25d10 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
25d20 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
25d30 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
25d40 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25d50 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
25d60 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
25d70 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
25d80 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
25d90 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
25da0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
25db0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25dc0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
25dd0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
25de0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
25df0 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
25e00 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
25e10 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25e20 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
25e30 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25e40 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
25e50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
25e60 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
25e70 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
25e80 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
25e90 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
25ea0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
25eb0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
25ec0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
25ed0 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
25ee0 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
25ef0 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
25f00 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
25f10 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
25f20 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
25f30 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
25f40 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
25f50 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
25f60 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
25f70 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
25f80 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
25f90 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
25fa0 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
25fb0 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
25fc0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
25fd0 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
25fe0 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
25ff0 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
26000 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
26010 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
26020 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
26030 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
26040 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
26050 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
26060 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
26070 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
26080 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
26090 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
260a0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
260b0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
260c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
260d0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
260e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
260f0 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
26100 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
26110 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26120 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
26130 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
26140 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
26150 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
26160 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
26170 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
26180 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
26190 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
261a0 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
261b0 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
261c0 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
261d0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
261e0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
261f0 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
26200 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
26210 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
26220 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
26230 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
26240 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
26250 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
26260 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
26270 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
26280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26290 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
262a0 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
262b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
262c0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
262d0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
262e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
262f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26300 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
26310 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
26320 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
26330 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
26340 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
26350 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20  n.** the pager. 
26360 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  It returns the t
26370 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
26380 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
26390 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  base..**.** Howe
263a0 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
263b0 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
263c0 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
263d0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
263e0 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
263f0 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
26400 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
26410 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
26420 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
26430 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
26440 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
26450 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
26460 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
26470 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
26480 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
26490 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a  TER_FINISHED );.
264a0 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
264b0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
264c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
264d0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
264e0 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
264f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
26500 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
26510 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
26520 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
26530 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
26540 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26550 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
26560 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
26570 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
26580 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
26590 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
265a0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
265b0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
265c0 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
265d0 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
265e0 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
265f0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
26600 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
26610 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
26620 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
26630 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
26640 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
26650 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
26660 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
26670 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
26680 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
26690 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
266a0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
266b0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
266c0 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
266d0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
266e0 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
266f0 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
26700 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
26710 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
26720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
26730 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
26740 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26750 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
26760 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26780 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
26790 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  code */..  /* Ch
267a0 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
267b0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
267c0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
267d0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
267e0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
267f0 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  d), or one of th
26800 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68  e transitions th
26810 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
26820 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
26830 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
26840 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
26850 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
26860 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
26870 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
26880 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
26890 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e   (pPager->eLock>
268a0 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
268b0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
268c0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ock==NO_LOCK && 
268d0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
268e0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c  _LOCK).       ||
268f0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
26900 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
26910 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  & locktype==EXCL
26920 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
26930 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ..  do {.    rc 
26940 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
26950 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ager, locktype);
26960 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
26970 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
26980 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
26990 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
269a0 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
269b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
269c0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
269d0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
269e0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
269f0 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
26a00 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
26a10 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
26a20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
26a30 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
26a40 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
26a50 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
26a60 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
26a70 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
26a80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
26a90 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
26aa0 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
26ab0 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
26ac0 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
26ad0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
26ae0 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
26af0 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
26b00 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
26b10 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
26b20 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
26b30 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
26b40 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
26b50 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
26b60 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
26b70 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
26b80 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
26b90 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
26ba0 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
26bb0 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
26bc0 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
26bd0 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
26be0 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
26bf0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
26c00 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
26c10 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
26c20 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
26c30 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
26c40 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
26c50 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
26c60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26c70 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
26c80 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
26c90 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
26ca0 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
26cb0 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
26cc0 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c  ct behavior woul
26cd0 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
26ce0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
26cf0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
26d00 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
26d10 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
26d20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
26d30 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
26d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
26d50 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
26d60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
26d70 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
26d80 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
26d90 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
26da0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
26db0 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
26dc0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
26dd0 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
26de0 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
26df0 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
26e00 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
26e10 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
26e20 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
26e30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
26e40 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
26e50 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
26e60 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
26e70 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
26e80 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
26e90 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
26ea0 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
26eb0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
26ec0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
26ed0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
26ee0 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
26ef0 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
26f00 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
26f10 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
26f20 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
26f30 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
26f40 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
26f50 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26f60 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
26f70 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
26f80 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
26f90 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
26fa0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
26fb0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
26fc0 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
26fd0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
26fe0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
26ff0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
27000 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
27010 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
27020 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
27030 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
27040 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
27050 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
27060 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
27070 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
27080 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
27090 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
270a0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
270b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
270c0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
270d0 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72  lled right befor
270e0 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  e committing a t
270f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f  ransaction..** O
27100 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nce this functio
27110 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  n has been calle
27120 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  d, the transacti
27130 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62  on must either b
27140 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e.** rolled back
27150 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49   or committed. I
27160 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
27170 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
27180 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20  ion and.** then 
27190 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67  continue writing
271a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
271b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
271c0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
271d0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
271e0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
271f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27200 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
27210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
27220 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
27230 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
27240 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OD );.  pPager->
27250 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
27260 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  /* At one poi
27270 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  nt the code here
27280 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72   called assertTr
27290 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
272a0 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72  () to.  ** ensur
272b0 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  e that all pages
272c0 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64   being truncated
272d0 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70   away by this op
272e0 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a  eration are,.  *
272f0 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * if one or more
27300 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
27310 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e  open, present in
27320 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
27330 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20    ** journal so 
27340 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
27350 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65   restored if the
27360 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f   savepoint is ro
27370 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20  lled.  ** back. 
27380 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  This is no longe
27390 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  r necessary as t
273a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
273b0 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61  now only.  ** ca
273c0 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72  lled right befor
273d0 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  e committing a t
273e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61  ransaction. So a
273f0 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a  lthough the .  *
27400 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d  * Pager object m
27410 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70  ay still have op
27420 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50  en savepoints (P
27430 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21  ager.nSavepoint!
27440 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20  =0), .  ** they 
27450 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
27460 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73   back. So the as
27470 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
27480 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20  traint() call.  
27490 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
274a0 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a  correct. */.}...
274b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
274c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
274d0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
274e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
274f0 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
27500 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
27510 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
27520 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
27530 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
27540 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
27550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
27560 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
27570 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
27580 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
27590 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
275a0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
275b0 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
275c0 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
275d0 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
275e0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
275f0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
27600 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
27610 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
27620 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
27630 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
27640 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
27650 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
27660 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
27670 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
27680 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
27690 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
276a0 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
276b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
276c0 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
276d0 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
276e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
276f0 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
27700 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
27710 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27720 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
27730 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
27740 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
27750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
27760 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
27770 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
27780 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
27790 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
277a0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
277b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
277c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
277d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
277e0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
277f0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
27800 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
27810 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
27820 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27830 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ZE>0./*.** Obtai
27840 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
27850 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64   a memory mapped
27860 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72   page object for
27870 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
27880 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  o. .** The new o
27890 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74  bject will use t
278a0 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61  he pointer pData
278b0 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  , obtained from 
278c0 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20  xFetch()..** If 
278d0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
278e0 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74  *ppPage to point
278f0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
27900 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e   reference.** an
27910 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
27920 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  OK. Otherwise, r
27930 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27940 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73  error code and s
27950 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f  et.** *ppPage to
27960 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67   zero..**.** Pag
27970 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74  e references obt
27980 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
27990 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
279a0 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65  hould be release
279b0 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20  d.** by calling 
279c0 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
279d0 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
279e0 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
279f0 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65  eMapPage(.  Page
27a00 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
27a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27a20 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
27a30 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a50 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
27a60 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  */.  void *pData
27a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27a80 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29       /* xFetch()
27a90 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  'd data for this
27aa0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
27ab0 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20   **ppPage       
27ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
27ad0 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65  T: Acquired page
27ae0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
27af0 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
27b20 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20   page to return 
27b30 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67  */.  .  if( pPag
27b40 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27b50 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  t ){.    *ppPage
27b60 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70   = p = pPager->p
27b70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
27b80 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
27b90 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69  reelist = p->pDi
27ba0 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
27bb0 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ty = 0;.    asse
27bc0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  rt( pPager->nExt
27bd0 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65 6d  ra>=8 );.    mem
27be0 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30  set(p->pExtra, 0
27bf0 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 8);.  }else{. 
27c00 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
27c10 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65   (PgHdr *)sqlite
27c20 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
27c30 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61 67  of(PgHdr) + pPag
27c40 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
27c50 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
27c60 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
27c70 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
27c80 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
27c90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27ca0 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
27cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27cc0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
27cd0 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20      p->pExtra = 
27ce0 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20  (void *)&p[1];. 
27cf0 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47     p->flags = PG
27d00 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d  HDR_MMAP;.    p-
27d10 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
27d20 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
27d30 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  r;.  }..  assert
27d40 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f  ( p->pExtra==(vo
27d50 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20  id *)&p[1] );.  
27d60 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
27d70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27d80 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52   p->flags==PGHDR
27d90 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72  _MMAP );.  asser
27da0 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50  t( p->pPager==pP
27db0 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
27dc0 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  ( p->nRef==1 );.
27dd0 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  .  p->pgno = pgn
27de0 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20  o;.  p->pData = 
27df0 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d  pData;.  pPager-
27e00 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20  >nMmapOut++;..  
27e10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27e20 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
27e30 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
27e40 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
27e50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
27e60 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
27e70 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
27e80 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
27e90 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
27ea0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
27eb0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
27ec0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
27ed0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
27ee0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
27ef0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
27f00 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
27f10 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
27f20 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
27f30 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27f40 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
27f50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
27f60 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
27f70 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
27f80 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
27f90 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
27fa0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
27fb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
27fc0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
27fd0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
27fe0 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
27ff0 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
28000 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
28010 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
28020 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
28030 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
28040 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
28050 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
28060 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
28070 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
28080 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
28090 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
280a0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
280b0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
280c0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
280d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
280e0 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74  has not be delet
280f0 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75  ed or renamed ou
28100 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20  t from.** under 
28110 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75  the pager.  Retu
28120 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
28130 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
28140 73 74 69 6c 6c 20 77 68 65 72 65 20 69 74 20 6f  still where it o
28150 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e  ught.** to be on
28160 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e   disk.  Return n
28170 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f  on-zero (SQLITE_
28180 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
28190 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
281a0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f  rror.** code fro
281b0 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  m sqlite3OsAcces
281c0 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61  s()) if the data
281d0 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69  base has gone mi
281e0 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
281f0 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55   int databaseIsU
28200 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50  nmoved(Pager *pP
28210 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61  ager){.  int bHa
28220 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e  sMoved = 0;.  in
28230 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
28240 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20  ger->tempFile ) 
28250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28260 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
28270 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75  dbSize==0 ) retu
28280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
282a0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61  zFilename && pPa
282b0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
282c0 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ] );.  rc = sqli
282d0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
282e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
282f0 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
28300 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29  VED, &bHasMoved)
28310 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
28320 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
28330 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53     /* If the HAS
28340 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74  _MOVED file-cont
28350 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65  rol is unimpleme
28360 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  nted, assume tha
28370 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  t the file.    *
28380 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  * has not been m
28390 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74  oved.  That is t
283a0 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65  he historical be
283b0 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65  havior of SQLite
283c0 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a  : prior to.    *
283d0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c  * version 3.8.3,
283e0 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65   it never checke
283f0 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  d */.    rc = SQ
28400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
28410 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28420 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20  OK && bHasMoved 
28430 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
28440 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
28450 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VED;.  }.  retur
28460 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
28470 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
28480 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
28490 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
284a0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
284b0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
284c0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
284d0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
284e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
284f0 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
28500 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
28510 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
28520 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
28530 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
28540 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
28550 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
28560 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
28570 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
28580 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
28590 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
285a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
285b0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
285c0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
285d0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
285e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
285f0 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
28600 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
28610 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
28620 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
28630 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
28640 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
28650 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
28660 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
28670 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
28680 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
28690 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
286a0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
286b0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
286c0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
286d0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
286e0 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69  er *pPager, sqli
286f0 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20 2a  te3 *db){.  u8 *
28700 70 54 6d 70 20 3d 20 28 75 38 2a 29 70 50 61 67  pTmp = (u8*)pPag
28710 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
28720 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70   assert( db || p
28730 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
28740 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
28750 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
28760 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
28770 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
28780 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
28790 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
287a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
287b0 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
287c0 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
287d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
287e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
287f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
28800 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
28810 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
28820 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 30 3b  {.    u8 *a = 0;
28830 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20  .    assert( db 
28840 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  || pPager->pWal=
28850 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62  =0 );.    if( db
28860 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67   && 0==(db->flag
28870 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70  s & SQLITE_NoCkp
28880 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20 20 20 20  tOnClose) .     
28890 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 64 61  && SQLITE_OK==da
288a0 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
288b0 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b 0a 20  pPager).    ){. 
288c0 20 20 20 20 20 61 20 3d 20 70 54 6d 70 3b 0a 20       a = pTmp;. 
288d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
288e0 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
288f0 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61 67 65  >pWal, db, pPage
28900 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 2c  r->walSyncFlags,
28910 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
28920 65 2c 61 29 3b 0a 20 20 20 20 70 50 61 67 65 72  e,a);.    pPager
28930 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ->pWal = 0;.  }.
28940 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
28950 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
28960 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
28970 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
28980 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
28990 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
289a0 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
289b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
289c0 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
289d0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
289e0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
289f0 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
28a00 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
28a10 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
28a20 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
28a30 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
28a40 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
28a50 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
28a60 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
28a70 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
28a80 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
28a90 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
28aa0 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
28ab0 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
28ac0 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
28ad0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
28ae0 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
28af0 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
28b00 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
28b10 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
28b20 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
28b30 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
28b40 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
28b50 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
28b60 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
28b70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
28b80 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
28b90 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
28ba0 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
28bb0 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
28bc0 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
28bd0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
28be0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
28bf0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
28c00 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
28c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28c20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
28c30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
28c40 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
28c50 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
28c60 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
28c70 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
28c80 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
28c90 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
28ca0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
28cb0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
28cc0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
28cd0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
28ce0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
28cf0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
28d00 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28d10 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
28d20 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
28d30 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
28d40 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
28d50 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
28d60 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
28d70 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
28d80 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
28d90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
28da0 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
28db0 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
28dc0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
28dd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
28de0 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
28df0 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
28e00 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
28e10 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
28e20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
28e30 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
28e40 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
28e50 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
28e60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
28e70 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
28e80 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
28e90 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
28ea0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
28eb0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
28ec0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
28ed0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
28ee0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
28ef0 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
28f00 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
28f10 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
28f20 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
28f30 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
28f40 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
28f50 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
28f60 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
28f70 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
28f80 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
28f90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
28fa0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
28fb0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
28fc0 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
28fd0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
28fe0 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
28ff0 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
29000 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
29010 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
29020 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
29030 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
29040 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
29050 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
29060 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
29070 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
29080 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
29090 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
290a0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
290b0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
290c0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
290d0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
290e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
290f0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
29100 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
29110 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
29120 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
29130 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
29140 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
29150 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
29160 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
29170 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
29180 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
29190 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
291a0 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
291b0 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
291c0 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
291d0 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
291e0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
291f0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
29200 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
29210 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
29220 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
29230 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
29240 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
29250 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
29260 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
29270 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
29280 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
29290 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
292a0 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
292b0 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
292c0 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
292d0 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
292e0 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
292f0 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
29300 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
29310 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
29320 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
29330 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
29340 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
29350 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
29360 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
29370 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
29380 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
29390 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
293a0 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
293b0 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
293c0 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
293d0 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
293e0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
293f0 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
29400 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
29410 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
29420 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
29430 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
29440 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
29450 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
29460 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
29470 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
29480 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
29490 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
294a0 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
294b0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
294c0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
294d0 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
294e0 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
294f0 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
29500 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
29510 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
29520 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
29530 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
29540 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
29550 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29560 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
29570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29580 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
29590 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
295a0 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
295b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
295c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
295d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
295e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
295f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
29600 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
29610 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
29620 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
29630 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
29640 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
29650 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
29660 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
29670 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
29680 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
29690 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
296a0 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
296b0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
296c0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
296d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
296e0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
296f0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
29700 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
29710 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
29720 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
29730 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
29740 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
29750 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
29760 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
29770 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
29780 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
29790 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
297a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
297b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
297c0 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
297d0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
297e0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
297f0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
29800 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
29810 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
29820 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
29830 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
29840 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
29850 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
29860 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
29870 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
29880 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
29890 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
298a0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
298b0 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
298c0 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
298d0 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
298e0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
298f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
29900 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
29910 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
29920 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
29930 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
29940 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
29950 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
29960 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
29970 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
29980 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
29990 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
299a0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
299b0 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
299c0 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
299d0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
299e0 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
299f0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
29a00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
29a10 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
29a20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
29a30 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
29a40 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
29a50 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
29a60 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
29a70 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
29a80 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
29a90 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
29aa0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
29ab0 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
29ac0 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
29ad0 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
29ae0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
29af0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
29b00 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
29b10 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
29b20 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
29b30 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
29b40 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
29b50 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
29b60 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
29b70 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29b80 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
29b90 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
29ba0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
29bb0 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
29bc0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
29bd0 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
29be0 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
29bf0 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
29c00 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
29c10 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
29c20 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
29c30 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
29c40 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
29c50 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
29c60 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
29c70 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
29c80 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
29c90 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
29ca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
29cb0 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
29cc0 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
29cd0 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
29ce0 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
29cf0 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
29d00 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
29d10 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
29d20 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
29d30 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
29d40 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
29d50 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
29d60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
29d70 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
29d80 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
29d90 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
29da0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
29db0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
29dc0 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
29dd0 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
29de0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
29df0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29e00 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
29e10 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
29e20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
29e30 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
29e40 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
29e50 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
29e60 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
29e70 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
29e80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29e90 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
29ea0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
29eb0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
29ec0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29ed0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
29ee0 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
29ef0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
29f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
29f10 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
29f20 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
29f30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29f40 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
29f50 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
29f60 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
29f70 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
29f80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29f90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
29fa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
29fb0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
29fc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29fd0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
29fe0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
29ff0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
2a000 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a010 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
2a020 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
2a030 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
2a040 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
2a050 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
2a060 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
2a070 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
2a080 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
2a090 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
2a0a0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
2a0b0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
2a0c0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
2a0d0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
2a0e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2a0f0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
2a100 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
2a110 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
2a120 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
2a130 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
2a140 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
2a150 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
2a160 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
2a170 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
2a180 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
2a190 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
2a1a0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
2a1b0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
2a1c0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
2a1d0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
2a1e0 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
2a1f0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
2a200 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
2a210 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
2a220 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
2a230 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
2a240 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
2a250 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
2a260 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
2a270 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
2a280 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
2a290 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
2a2a0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
2a2b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2a2c0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
2a2d0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
2a2e0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
2a2f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a300 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2a310 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2a320 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
2a330 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2a340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2a350 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2a360 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
2a370 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
2a380 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2a390 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
2a3a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2a3b0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
2a3d0 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
2a3e0 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
2a3f0 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
2a400 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
2a410 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2a420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2a430 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2a440 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
2a450 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
2a460 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
2a470 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2a480 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
2a490 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
2a4a0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
2a4b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
2a4c0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2a4d0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
2a4e0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2a4f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2a500 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
2a510 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
2a520 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
2a530 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
2a540 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
2a550 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
2a560 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a580 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a590 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
2a5a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
2a5b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2a5c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
2a5d0 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
2a5e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
2a5f0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
2a600 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
2a610 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2a620 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
2a630 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
2a640 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a650 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2a660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2a670 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
2a680 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2a690 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a6a0 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
2a6b0 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
2a6c0 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
2a6d0 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
2a6e0 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
2a6f0 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
2a700 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
2a710 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
2a720 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
2a730 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
2a740 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
2a750 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2a760 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
2a770 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2a780 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
2a790 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
2a7a0 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
2a7b0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2a7c0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2a7d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a7e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
2a7f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2a800 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
2a810 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
2a820 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
2a830 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
2a840 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
2a850 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
2a860 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
2a870 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
2a880 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
2a890 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
2a8a0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
2a8b0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
2a8c0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
2a8d0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
2a8e0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
2a8f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2a900 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
2a910 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
2a920 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
2a930 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2a940 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2a950 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
2a960 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
2a970 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
2a980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2a990 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
2a9a0 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
2a9b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
2a9c0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
2a9d0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
2a9e0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
2a9f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
2aa00 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
2aa10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2aa20 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
2aa30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
2aa40 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
2aa50 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
2aa60 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
2aa70 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
2aa80 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
2aa90 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
2aaa0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
2aab0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
2aac0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
2aad0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
2aae0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
2aaf0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
2ab00 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
2ab10 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
2ab20 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
2ab30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
2ab40 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
2ab50 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
2ab60 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
2ab70 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
2ab80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2ab90 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
2aba0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
2abb0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2abc0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
2abd0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
2abe0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
2abf0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
2ac00 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
2ac10 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
2ac20 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
2ac30 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
2ac40 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
2ac50 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
2ac60 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
2ac70 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
2ac80 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
2ac90 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
2aca0 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
2acb0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
2acc0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
2acd0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
2ace0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
2acf0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2ad00 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2ad10 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2ad20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2ad30 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2ad40 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
2ad50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2ad60 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
2ad70 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
2ad80 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
2ad90 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
2ada0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2adb0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2adc0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
2add0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
2ade0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
2adf0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
2ae00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2ae30 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
2ae40 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
2ae50 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
2ae60 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
2ae70 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
2ae80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
2ae90 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2aea0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2aeb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2aec0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2aed0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2aee0 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
2aef0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
2af00 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
2af10 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
2af20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2af30 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72  ) || pList->pDir
2af40 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
2af50 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
2af60 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
2af70 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2af80 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
2af90 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
2afa0 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
2afb0 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
2afc0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
2afd0 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
2afe0 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
2aff0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
2b000 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
2b010 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
2b020 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2b030 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
2b040 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2b050 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
2b060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2b070 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
2b080 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
2b090 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
2b0a0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
2b0b0 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65  .  /* Before the
2b0c0 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69   first write, gi
2b0d0 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e  ve the VFS a hin
2b0e0 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69  t of what the fi
2b0f0 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69  nal.  ** file si
2b100 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f  ze will be..  */
2b110 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2b120 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
2b130 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2b140 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2b150 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61  TE_OK .   && pPa
2b160 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c  ger->dbHintSize<
2b170 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20  pPager->dbSize. 
2b180 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69    && (pList->pDi
2b190 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67  rty || pList->pg
2b1a0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  no>pPager->dbHin
2b1b0 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20  tSize).  ){.    
2b1c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
2b1d0 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
2b1e0 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
2b1f0 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
2b200 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
2b210 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2b220 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
2b230 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
2b240 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
2b250 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
2b260 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
2b270 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
2b280 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
2b290 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
2b2a0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
2b2b0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
2b2c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b2d0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
2b2e0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
2b2f0 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
2b300 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
2b310 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
2b320 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
2b330 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
2b340 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
2b350 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
2b360 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
2b370 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
2b380 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
2b390 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
2b3a0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
2b3b0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
2b3c0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
2b3d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
2b3e0 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
2b3f0 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
2b400 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
2b410 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
2b420 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
2b430 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2b440 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
2b450 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
2b460 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
2b470 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
2b480 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
2b490 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
2b4a0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
2b4b0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
2b4c0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
2b4d0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
2b4e0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
2b4f0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b510 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
2b520 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
2b530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2b540 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2b550 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2b560 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
2b570 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
2b580 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
2b590 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
2b5a0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
2b5b0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
2b5c0 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
2b5d0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
2b5e0 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
2b5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b600 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a  M_BKPT, pData);.
2b610 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
2b620 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
2b630 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
2b640 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2b650 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
2b660 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
2b670 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
2b680 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
2b690 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
2b6a0 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
2b6b0 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
2b6c0 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
2b6d0 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
2b6e0 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
2b6f0 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
2b700 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
2b710 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
2b720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b730 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
2b740 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
2b750 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2b760 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
2b770 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2b780 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
2b790 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
2b7a0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
2b7b0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
2b7c0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
2b7d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2b7e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
2b7f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2b800 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
2b810 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
2b820 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
2b830 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
2b840 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
2b850 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
2b860 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
2b870 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
2b880 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
2b890 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
2b8a0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
2b8b0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
2b8c0 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
2b8d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2b8e0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
2b8f0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b910 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b920 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
2b930 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
2b940 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2b950 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
2b960 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
2b970 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
2b980 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
2b990 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
2b9a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b9b0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
2b9c0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2b9d0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2b9e0 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
2b9f0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
2ba00 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
2ba10 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
2ba20 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2ba30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2ba40 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
2ba50 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
2ba60 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ba70 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
2ba80 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
2ba90 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
2baa0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
2bab0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2bac0 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
2bad0 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
2bae0 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
2baf0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
2bb00 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
2bb10 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
2bb20 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
2bb30 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
2bb40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
2bb50 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
2bb60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2bb70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2bb80 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
2bb90 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2bba0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
2bbb0 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45   flags =  SQLITE
2bbc0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2bbd0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
2bbe0 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20  EADWRITE .      
2bbf0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
2bc00 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
2bc10 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20  EN_EXCLUSIVE .  
2bc20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
2bc30 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
2bc40 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70  .    int nStmtSp
2bc50 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e  ill = sqlite3Con
2bc60 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a  fig.nStmtSpill;.
2bc70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2bc80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2bc90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2bca0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
2bcb0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
2bcc0 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c  .      nStmtSpil
2bcd0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  l = -1;.    }.  
2bce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2bcf0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
2bd00 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65  ->pVfs, 0, pPage
2bd10 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20  r->sjfd, flags, 
2bd20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d  nStmtSpill);.  }
2bd30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bd40 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
2bd50 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
2bd60 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
2bd70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
2bd80 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a  ub-journal. .**.
2bd90 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2bda0 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
2bdb0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2bdc0 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
2bdd0 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
2bde0 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
2bdf0 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
2be00 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
2be10 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2be20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2be30 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2be40 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
2be50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2be60 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
2be70 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
2be80 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2be90 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2bea0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
2beb0 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
2bec0 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
2bed0 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
2bee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bef0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
2bf00 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
2bf10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2bf20 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2bf30 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2bf40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
2bf50 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2bf60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2bf70 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  F ){..    /* Ope
2bf80 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2bf90 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  l, if it has not
2bfa0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
2bfb0 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ened */.    asse
2bfc0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2bfd0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
2bfe0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2bff0 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67  ger->jfd) || pag
2c000 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2c010 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c020 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2c030 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2c040 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20  nSubRec==0 );.  
2c050 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
2c060 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
2c070 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
2c080 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
2c090 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20   pPg) .         
2c0a0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2c0b0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2c0c0 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2c0d0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2c0e0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2c0f0 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2c100 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2c110 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2c120 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2c130 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2c140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2c150 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2c160 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2c170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c180 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2c190 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2c1a0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2c1b0 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2c1c0 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2c1d0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2c1e0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2c1f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ..#if SQLITE_HAS
2c200 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20  _CODEC   .      
2c210 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62  if( !pPager->sub
2c220 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2c230 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2c240 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
2c250 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
2c260 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2c270 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  T, pData2);.    
2c280 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2c290 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 70 44       pData2 = pD
2c2a0 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52  ata;.      PAGER
2c2b0 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
2c2c0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
2c2d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2c2e0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2c2f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
2c300 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2c310 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
2c320 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2c330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2c350 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2c360 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
2c370 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
2c380 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
2c390 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
2c3a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
2c3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c3c0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
2c3d0 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
2c3e0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2c3f0 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
2c400 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
2c410 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
2c420 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
2c430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
2c440 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2c450 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2c460 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ed(PgHdr *pPg){.
2c470 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2c480 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2c490 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75     return subjou
2c4a0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2c4b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2c4c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c4d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2c4e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2c4f0 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2c500 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2c510 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2c520 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2c530 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2c540 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2c550 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2c560 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2c570 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2c580 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2c590 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2c5a0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2c5b0 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2c5c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2c5d0 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2c5e0 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2c5f0 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2c600 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2c610 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2c620 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2c630 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2c640 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2c650 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2c660 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2c670 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2c680 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2c690 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c6a0 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2c6b0 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2c6c0 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2c6d0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2c6e0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2c6f0 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2c700 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2c710 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2c720 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2c730 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2c740 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2c750 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2c760 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2c770 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2c780 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2c790 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2c7a0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2c7b0 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2c7c0 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2c7d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2c7e0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2c7f0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2c800 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2c810 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2c820 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2c830 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2c840 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2c850 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2c860 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2c870 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2c880 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2c890 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2c8a0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2c8b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2c8c0 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2c8d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c8e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2c8f0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2c900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2c910 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2c920 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2c930 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59   doNotSpill NOSY
2c940 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75  NC bit is set du
2c950 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
2c960 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
2c970 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
2c980 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
2c990 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
2c9a0 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
2c9b0 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
2c9c0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2c9d0 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
2c9e0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
2c9f0 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
2ca00 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
2ca10 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
2ca20 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
2ca30 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2ca40 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46  ROLLBACK and OFF
2ca50 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61   bits inhibits a
2ca60 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
2ca70 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73  g.  ** regardles
2ca80 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
2ca90 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
2caa0 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
2cab0 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a   set during.  **
2cac0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62   a rollback or b
2cad0 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20  y user request, 
2cae0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
2caf0 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
2cb00 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
2cb10 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
2cb20 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
2cb30 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
2cb40 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
2cb50 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
2cb60 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
2cb70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74  mplementation it
2cb80 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2cb90 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2cba0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2cbb0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2cbc0 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20  createFlag==3.  
2cbd0 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2cbe0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2cbf0 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2cc00 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2cc10 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2cc20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2cc30 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2cc40 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2cc50 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2cc60 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2cc70 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2cc80 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2cc90 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2cca0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2ccb0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2ccc0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2ccd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2cce0 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2ccf0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2cd00 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2cd10 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2cd20 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2cd30 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2cd40 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2cd50 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2cd60 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2cd70 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2cd80 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2cd90 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2cda0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2cdb0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2cdc0 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2cdd0 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2cde0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2cdf0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2ce00 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2ce10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2ce20 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
2ce30 5b 50 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c  [PAGER_STAT_SPIL
2ce40 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e 70 44 69  L]++;.  pPg->pDi
2ce50 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2ce60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2ce70 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
2ce80 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
2ce90 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
2cea0 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
2ceb0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2cec0 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2ced0 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20  (pPg); .    if( 
2cee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cef0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2cf00 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
2cf10 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20  r, pPg, 0, 0);. 
2cf20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2cf30 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
2cf40 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
2cf50 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69  OMIC_WRITE.    i
2cf60 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
2cf70 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2cf80 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2cf90 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72  nalCreate(pPager
2cfa0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
2cfb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cfc0 29 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65  ) return pager_e
2cfd0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2cfe0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2cff0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2d000 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2d010 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2d020 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2d030 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2d040 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2d050 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2d060 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2d070 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2d080 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2d090 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2d0a0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2d0b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2d0c0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2d0d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d0e0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2d0f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2d110 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2d120 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2d130 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2d140 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2d150 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2d160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2d170 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2d180 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2d190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d1a0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2d1b0 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2d1c0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2d1d0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2d1e0 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2d1f0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2d200 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2d210 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2d220 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2d230 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2d240 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2d250 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2d260 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2d270 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2d280 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2d290 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2d2a0 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2d2b0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2d2c0 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2d2d0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2d2e0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2d2f0 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2d300 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2d310 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2d320 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2d330 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2d340 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2d350 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2d360 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2d370 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2d380 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2d390 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2d3a0 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2d3b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2d3c0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2d3d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2d3e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d3f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2d400 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2d410 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2d420 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2d430 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2d440 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2d450 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2d460 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2d470 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2d480 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2d490 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2d4a0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2d4b0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2d4c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d4d0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2d4e0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2d4f0 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2d500 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2d510 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2d520 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2d530 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2d540 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2d550 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2d560 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2d570 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2d580 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2d590 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2d5a0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2d5b0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2d5c0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2d5d0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2d5e0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2d5f0 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2d600 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2d610 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2d620 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2d630 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2d640 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2d650 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2d660 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2d670 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2d680 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2d690 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2d6a0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2d6b0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2d6c0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2d6d0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2d6e0 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65 77 20  PI.  When a new 
2d6f0 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
2d700 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  d, the.** first 
2d710 38 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  8 bytes of this 
2d720 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f 65 64  space are zeroed
2d730 20 62 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64   but the remaind
2d740 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69  er is uninitiali
2d750 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74  zed..** (The ext
2d760 72 61 20 73 70 61 63 65 20 69 73 20 75 73 65 64  ra space is used
2d770 20 62 79 20 62 74 72 65 65 20 61 73 20 74 68 65   by btree as the
2d780 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e   MemPage object.
2d790 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ).**.** The flag
2d7a0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2d7b0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2d7c0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2d7d0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2d7e0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2d7f0 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2d800 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2d810 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2d820 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2d830 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2d840 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2d850 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2d860 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2d870 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2d880 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2d890 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2d8a0 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2d8b0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2d8c0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2d8d0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2d8e0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2d8f0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2d900 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2d910 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2d920 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2d930 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2d940 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2d950 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2d960 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2d970 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2d980 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2d990 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2d9a0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2d9b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2d9c0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2d9d0 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2d9e0 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2d9f0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2da00 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2da10 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2da20 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2da30 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2da40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2da50 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2da60 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2da70 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2da80 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2da90 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2daa0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2dab0 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2dac0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2dad0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2dae0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2daf0 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2db00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2db10 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2db20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2db30 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2db40 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2db50 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2db60 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2db70 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2db80 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2db90 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2dba0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2dbb0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2dbc0 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2dbd0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2dbe0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2dbf0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2dc00 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2dc10 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2dc20 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2dc30 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2dc40 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2dc50 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2dc60 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2dc70 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2dc80 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2dc90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2dca0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2dcb0 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2dcc0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2dcd0 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2dce0 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2dcf0 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2dd00 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2dd10 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2dd20 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2dd30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2dd40 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2dd50 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
2dd60 4c 49 5a 45 0a 20 20 69 6e 74 20 6d 65 6d 4a 4d  LIZE.  int memJM
2dd70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2dd80 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  /* Memory journa
2dd90 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a  l mode */.#else.
2dda0 23 20 64 65 66 69 6e 65 20 6d 65 6d 4a 4d 20 30  # define memJM 0
2ddb0 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 65  .#endif.  int re
2ddc0 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2ddd0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2dde0 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2ddf0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2de00 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2de10 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2de20 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2de30 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2de40 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2de50 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2de60 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2de70 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2de80 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2de90 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2dea0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2deb0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2dec0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2ded0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2dee0 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2def0 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2df00 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2df10 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2df20 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2df30 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2df40 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2df50 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2df60 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2df70 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2df80 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2df90 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2dfa0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2dfb0 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2dfc0 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2dfd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2dfe0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2dff0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2e000 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2e010 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2e020 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2e030 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2e040 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2e050 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2e060 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2e070 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2e080 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2e090 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2e0a0 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75  rnal).  */.  jou
2e0b0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2e0c0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75  OUND8(sqlite3Jou
2e0d0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b  rnalSize(pVfs));
2e0e0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
2e0f0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
2e100 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
2e110 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
2e120 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
2e130 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2e140 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
2e150 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  .  if( flags & P
2e160 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  AGER_MEMORY ){. 
2e170 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
2e180 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2e190 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2e1a0 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  ){.      zPathna
2e1b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
2e1c0 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d  rDup(0, zFilenam
2e1d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  e);.      if( zP
2e1e0 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65  athname==0  ) re
2e1f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2e200 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50  M_BKPT;.      nP
2e210 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2e220 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2e230 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c  ame);.      zFil
2e240 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ename = 0;.    }
2e250 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2e260 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
2e270 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
2e280 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
2e290 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
2e2a0 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
2e2b0 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
2e2c0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
2e2d0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
2e2e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
2e2f0 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
2e300 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
2e310 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
2e320 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2e330 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2e340 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  e[0] ){.    cons
2e350 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e  t char *z;.    n
2e360 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
2e370 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
2e380 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2e390 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
2e3a0 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32  w(0, nPathname*2
2e3b0 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
2e3c0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
2e3d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e3e0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2e3f0 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30  .    zPathname[0
2e400 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
2e410 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
2e420 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
2e430 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
2e440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e450 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
2e460 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
2e470 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68  nPathname, zPath
2e480 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68  name);.    nPath
2e490 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2e4a0 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2e4b0 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20  );.    z = zUri 
2e4c0 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c  = &zFilename[sql
2e4d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
2e4e0 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20  lename)+1];.    
2e4f0 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
2e500 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2e510 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2e520 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2e530 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2e540 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20     }.    nUri = 
2e550 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55  (int)(&z[1] - zU
2e560 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ri);.    assert(
2e570 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20   nUri>=0 );.    
2e580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e590 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
2e5a0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
2e5b0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
2e5c0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2e5d0 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
2e5e0 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
2e5f0 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
2e600 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
2e610 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
2e620 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
2e630 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
2e640 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
2e650 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
2e660 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
2e670 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
2e680 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
2e690 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
2e6a0 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
2e6b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
2e6c0 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
2e6d0 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
2e6e0 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
2e6f0 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
2e700 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e710 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2e720 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2e730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e740 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e750 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2e760 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2e780 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
2e790 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
2e7a0 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
2e7b0 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
2e7c0 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
2e7d0 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
2e7e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2e7f0 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
2e800 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
2e810 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
2e820 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
2e830 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2e840 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
2e850 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e860 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
2e870 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
2e880 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
2e890 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e8a0 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
2e8b0 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
2e8c0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2e8d0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
2e8e0 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
2e8f0 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
2e900 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
2e910 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2e920 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
2e930 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2e940 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
2e950 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2e960 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
2e970 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2e980 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2e990 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
2e9a0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2e9b0 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
2e9c0 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
2e9d0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2e9e0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2e9f0 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
2ea00 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
2ea10 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2ea20 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
2ea30 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2ea40 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
2ea50 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2ea60 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
2ea70 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
2ea80 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
2ea90 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
2eaa0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
2eab0 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
2eac0 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
2ead0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2eae0 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
2eaf0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
2eb00 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
2eb10 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
2eb20 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20   + nUri +       
2eb30 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
2eb40 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
2eb50 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 8 + 2         
2eb60 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
2eb70 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2eb80 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2eb90 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20  + nPathname + 4 
2eba0 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f  + 2            /
2ebb0 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66  * zWal */.#endif
2ebc0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
2ebd0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2ebe0 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
2ebf0 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
2ec00 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
2ec10 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
2ec20 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2ec30 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2ec40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ec50 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
2ec60 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
2ec70 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
2ec80 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
2ec90 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
2eca0 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
2ecb0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2ecc0 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
2ecd0 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
2ece0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2ecf0 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
2ed00 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
2ed10 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
2ed20 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2ed30 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2ed40 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
2ed50 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
2ed60 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2ed70 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2ed80 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
2ed90 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
2eda0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
2edb0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2edc0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2edd0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
2ede0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
2edf0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2ee00 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
2ee10 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
2ee20 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
2ee30 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
2ee40 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
2ee50 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68     assert( nPath
2ee60 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50  name>0 );.    pP
2ee70 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
2ee80 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2ee90 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
2eea0 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65   + nUri);.    me
2eeb0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
2eec0 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
2eed0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2eee0 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65     if( nUri ) me
2eef0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46  mcpy(&pPager->zF
2ef00 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
2ef10 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69  e+1], zUri, nUri
2ef20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2ef30 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2ef40 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2ef50 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2ef60 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2ef70 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2ef80 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20  "-journal\000", 
2ef90 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  8+2);.    sqlite
2efa0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2efb0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2efc0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2efd0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2efe0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70  E_OMIT_WAL.    p
2eff0 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70  Pager->zWal = &p
2f000 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2f010 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a  nPathname+8+1];.
2f020 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2f030 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61  r->zWal, zPathna
2f040 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2f050 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2f060 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61  er->zWal[nPathna
2f070 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c  me], "-wal\000",
2f080 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74   4+1);.    sqlit
2f090 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2f0a0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2f0b0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a   pPager->zWal);.
2f0c0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2f0d0 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2f0e0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2f0f0 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2f100 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2f110 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2f120 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
2f130 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
2f140 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2f150 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2f160 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  ] ){.    int fou
2f170 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2f180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2f190 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2f1a0 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
2f1b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f1c0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2f1d0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2f1e0 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
2f1f0 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
2f200 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29  assert( !memDb )
2f210 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2f220 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
2f230 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d 20 3d 20 28  ZE.    memJM = (
2f240 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2f250 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e  _MEMORY)!=0;.#en
2f260 64 69 66 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  dif.    readOnly
2f270 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2f280 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 21 3d  OPEN_READONLY)!=
2f290 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
2f2a0 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2f2b0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2f2c0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2f2d0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2f2e0 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2f2f0 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2f300 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2f310 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2f320 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2f330 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2f340 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2f350 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2f360 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2f370 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f380 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2f390 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2f3a0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2f3b0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2f3c0 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2f3d0 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2f3e0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2f3f0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2f400 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2f410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f420 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2f430 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2f440 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2f450 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2f460 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2f470 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2f480 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2f490 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2f4a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2f4b0 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2f4c0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f4d0 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2f4e0 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2f4f0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2f500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f510 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2f520 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2f530 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f550 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2f560 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f570 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2f580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f590 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2f5a0 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2f5b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2f5c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f5d0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2f5e0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2f5f0 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2f600 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2f610 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2f620 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2f630 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2f640 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2f650 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2f660 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2f670 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2f680 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2f690 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f6a0 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2f6b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2f6c0 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2f6d0 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2f6e0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f6f0 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2f700 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2f710 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2f720 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2f730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2f740 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2f750 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f770 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2f780 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2f790 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2f7a0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2f7b0 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2f7c0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2f7d0 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2f7e0 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2f7f0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2f800 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2f810 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2f820 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2f830 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2f840 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2f850 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2f860 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2f870 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2f880 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2f890 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2f8a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2f8b0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2f8c0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2f8d0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2f8e0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2f8f0 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2f900 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2f910 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2f920 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2f930 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2f940 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2f950 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2f960 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2f970 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2f980 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2f990 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2f9a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2f9b0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2f9c0 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2f9d0 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2f9e0 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2f9f0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2fa00 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2fa10 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2fa20 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2fa30 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2fa40 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2fa50 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2fa60 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2fa70 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2fa80 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2fa90 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2faa0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2fab0 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2fac0 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2fad0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2fae0 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2faf0 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2fb00 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2fb10 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2fb20 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20   EXCLUSIVE mode 
2fb30 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2fb40 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2fb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2fb60 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2fb70 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2fb80 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2fb90 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2fba0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2fbb0 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2fbc0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2fbd0 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2fbe0 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2fbf0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2fc00 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2fc10 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2fc20 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2fc30 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2fc40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2fc50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2fc60 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2fc70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2fc80 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2fc90 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2fca0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2fcb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fcc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2fcd0 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2fce0 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2fcf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fd00 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20  K ){.    nExtra 
2fd10 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
2fd20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
2fd30 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72  xtra>=8 && nExtr
2fd40 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63  a<1000 );.    rc
2fd50 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2fd60 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2fd70 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2fd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fd90 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2fda0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2fdb0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2fdc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2fdd0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2fde0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61  error occurred a
2fdf0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20  bove, free the  
2fe00 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2fe10 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2fe20 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2fe30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fe40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2fe50 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2fe60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
2fe70 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
2fe80 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  Space);.    sqli
2fe90 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2fea0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2feb0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2fec0 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2fed0 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2fee0 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2fef0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2ff00 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2ff10 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2ff20 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2ff30 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2ff40 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2ff50 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2ff60 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2ff70 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2ff80 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2ff90 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2ffa0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2ffb0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ffc0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2ffd0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ffe0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2fff0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
30000 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
30010 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
30020 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
30030 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
30040 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
30050 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
30060 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
30070 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
30080 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30090 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
300a0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
300b0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
300c0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
300d0 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
300e0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
300f0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
30100 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
30110 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30120 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
30130 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
30140 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
30150 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
30160 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
30170 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
30180 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
30190 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
301a0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
301b0 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
301c0 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
301d0 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
301e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
301f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
30200 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
30210 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
30220 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
30230 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
30240 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30  ger->fullSync==0
30250 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30260 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
30270 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
30280 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
30290 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
302a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
302b0 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
302c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
302d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
302e0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
302f0 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b  ->extraSync = 0;
30300 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
30310 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
30320 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
30330 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
30340 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
30350 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51  YNC_NORMAL | (SQ
30360 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
30370 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  <<2);.  }.  /* p
30380 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
30390 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
303a0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
303b0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
303c0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
303d0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
303e0 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
303f0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
30400 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
30410 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
30420 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
30430 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
30440 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
30450 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
30460 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
30470 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
30480 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
30490 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
304a0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
304b0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
304c0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
304d0 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a 20 20 20 20  || memJM ){.    
304e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
304f0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
30500 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
30510 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
30520 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
30530 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
30540 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
30550 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
30560 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
30570 20 78 52 65 69 6e 69 74 3b 0a 20 20 73 65 74 47   xReinit;.  setG
30580 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67  etterMethod(pPag
30590 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  er);.  /* memset
305a0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
305b0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
305c0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
305d0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  /* pPager->szMma
305e0 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  p = SQLITE_DEFAU
305f0 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20  LT_MMAP_SIZE // 
30600 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62  will be set by b
30610 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70  tree.c */..  *pp
30620 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
30630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30640 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54  OK;.}..../*.** T
30650 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30660 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
30670 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
30680 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
30690 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
306a0 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
306b0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
306c0 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
306d0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
306e0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
306f0 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
30700 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
30710 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
30720 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
30730 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
30740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
30750 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
30760 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
30770 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
30780 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
30790 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
307a0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
307b0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
307c0 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
307d0 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
307e0 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
307f0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
30800 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30810 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
30820 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30830 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
30840 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
30850 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
30860 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
30870 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
30880 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
30890 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
308a0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
308b0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
308c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
308d0 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
308e0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
308f0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
30900 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
30910 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
30920 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
30930 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
30940 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
30950 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
30960 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
30970 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
30980 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
30990 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
309a0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
309b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
309c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
309d0 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
309e0 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
309f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
30a00 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
30a10 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
30a20 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
30a30 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
30a40 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
30a50 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
30a60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30a70 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
30a80 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
30a90 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
30aa0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
30ab0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
30ac0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
30ad0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
30ae0 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
30af0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
30b00 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
30b10 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
30b20 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
30b30 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
30b40 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
30b50 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
30b60 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
30b70 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
30b80 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
30b90 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
30ba0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
30bb0 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
30bc0 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
30bd0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
30be0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
30bf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
30c00 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
30c10 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
30c20 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
30c30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30c40 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
30c50 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
30c60 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
30c70 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
30c80 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
30c90 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
30ca0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
30cb0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
30cc0 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
30cd0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
30ce0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
30cf0 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
30d00 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30d10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30d20 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
30d30 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
30d40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30d50 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
30d60 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
30d70 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
30d80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30d90 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
30da0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
30db0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
30dc0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
30dd0 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
30de0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30df0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
30e00 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
30e10 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
30e20 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
30e30 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
30e40 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
30e50 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
30e60 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
30e70 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
30e80 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
30e90 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
30ea0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
30eb0 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
30ec0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
30ed0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
30ee0 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
30ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30f00 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
30f10 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
30f20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
30f30 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
30f40 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
30f50 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
30f60 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
30f70 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
30f80 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
30f90 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
30fa0 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
30fb0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
30fc0 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
30fd0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
30fe0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
30ff0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
31000 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
31010 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
31020 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
31030 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
31040 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
31050 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
31060 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
31070 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
31080 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
31090 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
310a0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
310b0 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
310c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
310d0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
310e0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
310f0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
31100 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
31110 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
31120 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
31130 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
31140 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
31150 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
31160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31170 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
31180 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
31190 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
311a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
311b0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
311c0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
311d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
311f0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
31200 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ile */..      as
31210 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
31220 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  mpFile==0 );.   
31230 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
31240 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
31250 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
31260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31270 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
31280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
31290 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
312a0 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
312b0 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
312c0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
312d0 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
312e0 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
312f0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
31300 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
31310 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
31320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31330 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
31340 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
31350 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
31360 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
31370 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
31380 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
31390 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
313a0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
313b0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
313c0 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
313d0 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
313e0 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
313f0 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
31400 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
31410 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
31420 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
31430 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
31440 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
31450 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
31460 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
31470 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
31480 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
31490 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
314a0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
314b0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
314c0 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
314d0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
314e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
314f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
31510 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
31520 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31530 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
31540 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
31550 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
31560 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
31570 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
31580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
315a0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
315b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
315c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
315d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
315e0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
315f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
31600 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
31610 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
31620 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
31630 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
31640 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
31650 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
31660 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
31670 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
31680 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
31690 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
316a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
316b0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
316c0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
316d0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
316e0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
316f0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
31700 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
31710 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31720 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
31730 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
31740 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53    int f = .#if S
31750 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
31760 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
31770 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
31780 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c  er->vfsFlags&SQL
31790 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f  ITE_OPEN_FILEPRO
317a0 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23  TECTION_MASK)|.#
317b0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
317c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
317d0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
317e0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
317f0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
31800 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
31810 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
31820 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31830 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
31840 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31850 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31870 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
31880 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
31890 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
318a0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
318b0 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
318c0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
318d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
318e0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
318f0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
31900 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31910 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
31920 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
31930 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31950 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31960 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31980 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
31990 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
319a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
319b0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
319c0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
319d0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
319e0 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
319f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
31a00 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
31a10 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
31a20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
31a30 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
31a40 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
31a50 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
31a60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
31a70 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
31a80 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
31a90 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
31aa0 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
31ab0 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
31ac0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
31ad0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
31ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
31af0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
31b00 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
31b10 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
31b20 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
31b30 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
31b40 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
31b50 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
31b60 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
31b70 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
31b80 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
31b90 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
31ba0 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
31bb0 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
31bc0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
31bd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
31be0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
31bf0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
31c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
31c10 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
31c20 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
31c30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31c40 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
31c50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31c60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31c80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
31c90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
31ca0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
31cb0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
31cc0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
31cd0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
31ce0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
31cf0 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65  Get() until afte
31d00 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
31d10 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
31d20 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
31d30 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
31d40 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
31d50 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
31d60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31d70 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
31d80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
31d90 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
31da0 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
31db0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
31dc0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
31dd0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
31de0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
31df0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
31e00 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
31e10 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
31e20 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
31e30 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
31e40 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
31e50 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
31e60 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31e70 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
31e80 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
31e90 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
31ea0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
31eb0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
31ec0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
31ed0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
31ee0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
31ef0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
31f00 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
31f10 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
31f20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
31f30 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
31f40 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
31f50 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
31f60 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
31f70 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
31f80 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
31f90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
31fa0 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
31fb0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
31fc0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
31fd0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
31fe0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
31ff0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
32000 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
32010 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
32020 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
32030 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
32040 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
32050 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
32060 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
32070 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
32080 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
32090 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
320a0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
320b0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
320c0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
320d0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
320e0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
320f0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
32100 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
32110 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
32120 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
32130 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
32140 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
32150 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
32160 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
32170 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
32180 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
32190 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
321a0 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
321b0 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
321c0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
321d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
321e0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
321f0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
32200 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
32210 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
32220 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
32230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
32240 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
32250 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
32260 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
32270 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
32280 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
32290 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
322a0 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
322b0 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
322c0 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
322d0 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
322e0 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
322f0 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
32300 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
32310 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
32320 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
32330 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
32340 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  de.  */.  assert
32350 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
32360 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
32370 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
32380 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
32390 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
323a0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
323b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
323c0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
323d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
323e0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
323f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32400 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
32410 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  _OK );..  if( !p
32420 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32430 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
32440 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32450 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
32460 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
32470 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
32480 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
32490 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
324a0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
324b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
324c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
324d0 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
324e0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
324f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
32500 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
32510 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
32520 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
32530 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32560 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
32570 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
32580 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
32590 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
325a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
325b0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
325c0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
325d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
325e0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
325f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
32600 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
32610 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
32620 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
32630 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
32640 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
32650 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
32660 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
32670 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
32680 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
32690 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
326a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
326b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
326c0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
326d0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
326e0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
326f0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
32700 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
32710 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
32720 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
32730 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32740 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32750 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
32760 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32770 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
32780 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
32790 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
327a0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
327b0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
327c0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
327d0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
327e0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
327f0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
32800 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
32810 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
32820 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
32830 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
32840 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
32850 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
32860 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
32870 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
32880 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
32890 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
328a0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
328b0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
328c0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
328d0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
328e0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
328f0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
32900 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
32910 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
32920 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
32930 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
32940 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
32950 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
32960 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
32970 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
32980 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
32990 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
329a0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
329b0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
329c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
329d0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
329e0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
329f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
32a00 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
32a10 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
32a20 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
32a30 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
32a40 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
32a50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32a60 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
32a70 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32a80 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
32a90 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
32aa0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32ac0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32ad0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
32ae0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
32af0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
32b00 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
32b10 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
32b20 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
32b30 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
32b40 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
32b50 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
32b60 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
32b70 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
32b80 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
32b90 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
32ba0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
32bb0 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
32bc0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
32bd0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
32be0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
32bf0 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
32c00 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
32c10 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
32c20 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
32c30 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
32c40 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
32c50 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
32c60 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
32c70 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
32c80 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
32c90 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
32ca0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
32cb0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
32cc0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
32cd0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
32ce0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
32cf0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
32d00 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
32d10 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
32d20 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
32d30 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
32d40 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
32d50 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
32d60 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
32d70 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
32d80 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
32d90 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
32da0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
32db0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
32dc0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
32dd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
32de0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
32df0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32e00 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
32e10 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
32e20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
32e30 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
32e40 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
32e50 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
32e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32e70 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
32e80 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
32e90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32ea0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
32eb0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
32ec0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
32ed0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32ee0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
32ef0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
32f10 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
32f20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
32f30 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
32f40 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   = .#if SQLITE_E
32f50 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
32f60 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  CTION.          
32f70 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
32f80 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
32f90 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
32fa0 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
32fb0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
32fc0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
32fd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32fe0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
32ff0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
33000 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
33010 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
33020 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
33030 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
33040 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
33050 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
33060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
33070 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
33080 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
33090 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
330a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
330b0 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
330c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
330d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
330e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
330f0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
33100 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
33110 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
33120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
33130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33140 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
33150 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
33160 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
33170 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
33180 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
33190 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
331a0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
331b0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
331c0 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
331d0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
331e0 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
331f0 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
33200 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
33210 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
33220 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
33230 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
33240 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
33250 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
33260 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
33270 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
33280 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
33290 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
332a0 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
332b0 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
332c0 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
332d0 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
332e0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
332f0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
33300 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
33310 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
33320 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
33330 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
33340 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
33350 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
33360 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
33370 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
33380 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
33390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
333a0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
333b0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
333c0 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  r, !pPager->temp
333d0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
333e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
333f0 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
33400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33410 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
33420 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
33430 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
33440 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
33450 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
33460 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33470 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33480 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
33490 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
334a0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
334b0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
334c0 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
334d0 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
334e0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
334f0 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
33500 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
33510 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
33520 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
33530 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
33540 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
33550 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
33560 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
33570 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
33580 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
33590 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
335a0 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
335b0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
335c0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
335d0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
335e0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
335f0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
33600 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
33610 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
33620 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
33630 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
33640 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
33650 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
33660 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
33670 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
33680 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
33690 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
336a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
336b0 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
336c0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
336d0 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
336e0 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
336f0 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
33700 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
33710 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
33720 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
33730 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
33740 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
33750 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
33760 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
33770 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
33780 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
33790 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
337a0 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
337b0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
337c0 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
337d0 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
337e0 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
337f0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
33800 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
33810 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
33820 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
33830 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
33840 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
33850 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
33860 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
33870 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
33880 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
33890 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
338a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
338b0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
338c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
338d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
338e0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
338f0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
33900 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
33910 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
33920 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
33930 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
33940 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
33950 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72  mpFile && pPager
33960 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
33970 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
33980 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
33990 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
339a0 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
339b0 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
339c0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
339d0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
339e0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
339f0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
33a00 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
33a10 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
33a20 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  e hasHeldSharedL
33a30 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74  ock flag prevent
33a40 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  s this from.    
33a50 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f    ** occurring o
33a60 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  n the very first
33a70 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c   access to a fil
33a80 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  e, in order to s
33a90 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ave a.      ** s
33aa0 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72  ingle unnecessar
33ab0 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  y sqlite3OsRead(
33ac0 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74  ) call at the st
33ad0 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a  art-up..      **
33ae0 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
33af0 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64  se changes are d
33b00 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
33b10 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
33b20 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
33b30 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
33b40 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
33b50 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
33b60 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
33b70 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
33b80 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
33b90 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
33ba0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
33bb0 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
33bc0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
33bd0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
33be0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
33bf0 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
33c00 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
33c10 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
33c20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
33c30 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
33c40 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
33c50 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
33c60 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
33c70 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
33c80 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
33c90 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
33ca0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
33cb0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
33cc0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
33cd0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  */.      char db
33ce0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
33cf0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
33d00 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54  rs)];..      IOT
33d10 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
33d20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
33d30 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
33d40 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  s)));.      rc =
33d50 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
33d60 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
33d70 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
33d80 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
33d90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
33da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33db0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33dc0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
33dd0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
33de0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
33df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33e00 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
33e10 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
33e20 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
33e30 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
33e40 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
33e50 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
33e60 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
33e70 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
33e80 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
33e90 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
33ea0 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
33eb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33ec0 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
33ed0 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
33ee0 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
33ef0 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
33f00 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
33f10 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
33f20 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
33f30 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
33f40 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
33f50 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
33f60 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
33f70 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
33f80 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
33f90 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
33fa0 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
33fb0 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
33fc0 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
33fd0 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
33fe0 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
33ff0 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
34000 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
34010 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
34020 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
34030 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
34040 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
34050 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
34060 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
34070 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
34080 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
34090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
340a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
340b0 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
340c0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
340d0 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
340e0 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
340f0 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
34100 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
34110 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
34120 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
34130 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
34140 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
34150 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
34160 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34170 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
34180 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
34190 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
341a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
341b0 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
341c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
341d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
341e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
341f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
34200 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
34210 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
34220 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
34230 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70  tempFile==0 && p
34240 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34250 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
34260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34270 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
34280 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
34290 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
342a0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
342b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
342c0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
342d0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
342e0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
342f0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
34300 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34310 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
34320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
34330 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
34340 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
34350 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
34360 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
34370 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
34380 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
34390 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
343a0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
343b0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
343c0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
343d0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
343e0 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
343f0 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
34400 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
34410 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
34420 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
34430 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
34440 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
34450 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
34460 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
34470 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
34480 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
34490 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
344a0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
344b0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
344c0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
344d0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71  Pager){.  if( sq
344e0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
344f0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
34500 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  che)==0 ){.    a
34510 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
34520 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a  MmapOut==0 ); /*
34530 20 62 65 63 61 75 73 65 20 70 61 67 65 31 20 69   because page1 i
34540 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d  s never memory m
34550 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67  apped */.    pag
34560 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
34570 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
34580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
34590 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  ge getter method
345a0 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63  s each try to ac
345b0 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
345c0 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77  e to a.** page w
345d0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ith page number 
345e0 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71  pgno. If the req
345f0 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
34600 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
34610 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
34620 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
34630 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
34640 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
34650 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64  *.** There are d
34660 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65  ifferent impleme
34670 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
34680 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65  getter method de
34690 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  pending.** on th
346a0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
346b0 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  of the pager..**
346c0 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e  .**     getPageN
346d0 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20  ormal()         
346e0 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67  --  The normal g
346f0 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74  etter.**     get
34700 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20  PageError()     
34710 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66       --  Used if
34720 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
34730 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a   an error state.
34740 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d  **     getPageMm
34750 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d  ap()           -
34760 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72  -  Used if memor
34770 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
34780 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66  enabled.**.** If
34790 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
347a0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
347b0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
347c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
347d0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
347e0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
347f0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
34800 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
34810 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
34820 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34830 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
34840 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
34850 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
34860 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
34870 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
34880 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
34890 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
348a0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
348b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
348c0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
348d0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
348e0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
348f0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
34900 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
34910 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
34920 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
34930 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
34940 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
34950 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
34960 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
34970 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
34980 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
34990 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
349a0 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
349b0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
349c0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
349d0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
349e0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
349f0 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
34a00 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
34a10 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
34a20 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20  f .** the flags 
34a30 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
34a40 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  ns the PAGER_GET
34a50 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61  _NOCONTENT bit a
34a60 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
34a70 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
34a80 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
34a90 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
34aa0 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
34ab0 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
34ac0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
34ad0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
34ae0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
34af0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
34b00 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
34b10 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45  *.** If PAGER_GE
34b20 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74  T_NOCONTENT is t
34b30 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
34b40 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
34b50 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
34b60 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
34b70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
34b80 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
34b90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
34ba0 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
34bb0 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
34bc0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
34bd0 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
34be0 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
34bf0 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
34c00 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
34c10 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
34c20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
34c30 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
34c40 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
34c50 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
34c60 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
34c70 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
34c80 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45  l..**.** If PAGE
34c90 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34ca0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
34cb0 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
34cc0 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
34cd0 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65  d.** of being re
34ce0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
34cf0 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
34d00 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
34d10 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
34d20 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
34d30 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
34d40 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
34d50 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
34d60 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
34d70 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
34d80 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
34d90 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
34da0 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
34db0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
34dc0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
34dd0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
34de0 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
34df0 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
34e00 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
34e10 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
34e20 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
34e30 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
34e40 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
34e50 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
34e60 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
34e70 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
34e80 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
34e90 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
34ea0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
34eb0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
34ec0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
34ed0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
34ee0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
34ef0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
34f00 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34f10 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
34f20 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
34f30 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
34f40 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
34f50 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
34f60 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
34f70 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
34f80 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
34f90 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
34fa0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
34fb0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
34fc0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
34fd0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
34fe0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
34ff0 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
35000 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
35010 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
35020 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
35030 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
35040 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
35050 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
35060 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
35070 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
35080 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
35090 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
350a0 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
350b0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73  rnal files..*/.s
350c0 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
350d0 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72  eNormal(.  Pager
350e0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
350f0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
35100 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35110 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
35120 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
35130 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
35140 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
35150 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
35160 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
35170 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
35180 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
35190 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
351a0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
351b0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
351c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
351d0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
351e0 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20  u8 noContent;   
351f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35200 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52  /* True if PAGER
35210 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
35220 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74  s set */.  sqlit
35230 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
35240 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74  pBase;..  assert
35250 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35260 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
35270 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35280 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
35290 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
352a0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
352b0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
352c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
352d0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
352e0 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69  dLock==1 );..  i
352f0 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
35300 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35310 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65  PT_BKPT;.  pBase
35320 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35330 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
35340 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
35350 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20  .  if( pBase==0 
35360 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
35370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35380 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
35390 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
353a0 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
353b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
353c0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
353d0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
353e0 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d  ;.    if( pBase=
353f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
35400 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
35410 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
35420 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
35440 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
35450 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35460 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
35470 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
35480 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ase);.  assert( 
35490 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
354a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
354b0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
354c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
354d0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
354e0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
354f0 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d  ;..  noContent =
35500 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
35510 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d  GET_NOCONTENT)!=
35520 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  0;.  if( pPg->pP
35530 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
35540 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
35550 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
35560 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
35570 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
35580 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
35590 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
355a0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
355b0 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
355c0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
355d0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
355e0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
355f0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
35600 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
35610 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
35620 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
35630 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
35640 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
35650 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
35660 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
35670 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
35680 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
35690 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
356a0 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65  . But first some
356b0 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20   error checks:. 
356c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
356d0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
356e0 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
356f0 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65  .    ** (2) Neve
35700 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
35710 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
35720 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
35730 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
35740 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
35750 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
35760 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
35770 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35780 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
35790 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
357a0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  r;.    }..    pP
357b0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
357c0 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  er;..    assert(
357d0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
357e0 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29  >fd) || !MEMDB )
357f0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
35800 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
35810 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
35820 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
35830 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
35840 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
35850 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
35860 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
35870 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
35880 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
358a0 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
358b0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
358c0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
358d0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
358e0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
358f0 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
35900 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
35910 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
35920 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
35930 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
35940 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
35950 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
35960 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
35970 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
35980 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
35990 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
359a0 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
359b0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
359c0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
359d0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
359e0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
359f0 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
35a00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35a10 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
35a20 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
35a30 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
35a40 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
35a50 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
35a60 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
35a70 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
35a80 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
35a90 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
35aa0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
35ac0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
35ad0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
35ae0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
35af0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
35b00 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
35b10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
35b20 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35b30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35b40 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
35b50 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
35b60 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
35b70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
35b80 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
35b90 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
35ba0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
35bb0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
35bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
35bd0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
35be0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
35bf0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
35c00 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b  AGER_STAT_MISS]+
35c10 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  +;.      rc = re
35c20 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
35c30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
35c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35c50 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
35c60 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
35c70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
35c80 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
35c90 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
35ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
35cb0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
35cc0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
35cd0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
35ce0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
35cf0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
35d00 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
35d10 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
35d20 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67  Pager);.  *ppPag
35d30 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
35d40 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
35d50 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
35d60 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65  0./* The page ge
35d70 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65  tter for when me
35d80 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20  mory-mapped I/O 
35d90 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74  is enabled */.st
35da0 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
35db0 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70  MMap(.  Pager *p
35dc0 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
35dd0 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
35de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35df0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
35e00 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
35e10 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
35e20 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
35e30 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
35e40 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
35e50 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
35e60 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
35e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
35e80 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
35e90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
35ea0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
35eb0 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
35ec0 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
35ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ee0 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
35ef0 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
35f00 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  */..  /* It is a
35f10 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
35f20 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
35f30 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
35f40 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
35f50 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
35f60 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
35f70 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
35f80 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
35f90 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
35fa0 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
35fb0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
35fc0 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
35fd0 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
35fe0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
35ff0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
36000 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
36010 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
36020 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61  gno>1.   && (pPa
36030 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36040 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
36050 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
36060 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a  READONLY)).  );.
36070 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46 45  .  assert( USEFE
36080 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23  TCH(pPager) );.#
36090 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
360a0 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28  _CODEC.  assert(
360b0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
360c0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
360d0 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  /* Optimization 
360e0 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68  note:  Adding th
360f0 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d  e "pgno<=1" term
36100 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30   before "pgno==0
36110 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  " here.  ** allo
36120 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ws the compiler 
36130 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75  optimizer to reu
36140 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
36150 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20  f the "pgno>1". 
36160 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20   ** test in the 
36170 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65  previous stateme
36180 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65  nt, and avoid te
36190 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e  sting pgno==0 in
361a0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e   the.  ** common
361b0 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f   case where pgno
361c0 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20   is large. */.  
361d0 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70  if( pgno<=1 && p
361e0 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
361f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
36200 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
36210 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36220 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
36230 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
36240 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
36250 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36270 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
36280 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
36290 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
362a0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
362b0 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  ;..  if( bMmapOk
362c0 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
362d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
362e0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
362f0 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
36300 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
36310 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
36320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36330 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
36340 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
36350 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
36360 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46  f( bMmapOk && iF
36370 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76  rame==0 ){.    v
36380 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
36390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
363a0 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
363b0 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36  fd, .        (i6
363c0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
363d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
363e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
363f0 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20   &pData.    );. 
36400 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36410 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
36420 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36430 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
36440 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72  READER || pPager
36450 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
36460 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
36470 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
36480 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
36490 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
364a0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
364b0 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
364c0 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
364d0 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
364e0 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  &pPg);.      }el
364f0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
36500 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
36510 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
36520 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
36530 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
36540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36550 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
36560 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
36570 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
36580 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
36590 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
365a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
365b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
365c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
365d0 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
365e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
365f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
36600 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61 67  .  return getPag
36610 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20  eNormal(pPager, 
36620 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
36630 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ags);.}.#endif /
36640 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
36650 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20  P_SIZE>0 */../* 
36660 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20  The page getter 
36670 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20  method for when 
36680 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e 20  the pager is an 
36690 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73  error state */.s
366a0 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
366b0 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20  eError(.  Pager 
366c0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
366d0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
366e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
366f0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
36700 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
36710 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
36720 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
36730 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
36740 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
36750 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
36760 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
36770 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
36780 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
36790 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  gs */.){.  UNUSE
367a0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f  D_PARAMETER(pgno
367b0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
367c0 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20  METER(flags);.  
367d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
367e0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
367f0 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  OK );.  *ppPage 
36800 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 0;.  return pP
36810 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  ager->errCode;.}
36820 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61  .../* Dispatch a
36830 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72 65  ll page fetch re
36840 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61 70  quests to the ap
36850 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65 72  propriate getter
36860 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
36870 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36880 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36890 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
368a0 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
368b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
368c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
368d0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
368e0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
368f0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
36900 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
36910 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
36920 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
36930 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
36940 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
36950 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
36960 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
36970 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20  r->xGet(pPager, 
36980 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
36990 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ags);.}../*.** A
369a0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
369b0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
369c0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
369d0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
369e0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
369f0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
36a00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
36a10 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
36a20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
36a30 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
36a40 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
36a50 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
36a60 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
36a70 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
36a80 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
36a90 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
36aa0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
36ab0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
36ac0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
36ad0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
36ae0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
36af0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
36b00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
36b10 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
36b20 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
36b30 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
36b40 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
36b50 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
36b60 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
36b70 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
36b80 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
36b90 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
36ba0 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
36bb0 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
36bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
36bd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
36be0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
36bf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
36c00 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
36c10 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
36c20 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
36c30 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
36c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36c50 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ge==0 || pPager-
36c60 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
36c70 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ck );.  if( pPag
36c80 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
36c90 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
36ca0 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
36cb0 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
36cc0 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29  he, pgno, pPage)
36cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
36ce0 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
36cf0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nce..**.** The s
36d00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36d10 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  () and sqlite3Pa
36d20 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36d30 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) may only be.**
36d40 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77   used if we know
36d50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 62   that the page b
36d60 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73  eing released is
36d70 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61   not the last pa
36d80 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65  ge..** The btree
36d90 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f   layer always ho
36da0 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75  lds page1 open u
36db0 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f  ntil the end, so
36dc0 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20   these first.** 
36dd0 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20  to routines can 
36de0 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61  be used to relea
36df0 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65  se any page othe
36e00 72 20 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e  r than BtShared.
36e10 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73  pPage1..**.** Us
36e20 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
36e30 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20  refPageOne() to 
36e40 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20  release page1.  
36e50 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74  This latter rout
36e60 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68  ine.** checks th
36e70 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
36e80 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  f outstanding pa
36e90 67 65 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e  ges and if the n
36ea0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
36eb0 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69  s reaches zero i
36ec0 74 20 64 72 6f 70 73 20 74 68 65 20 64 61 74 61  t drops the data
36ed0 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  base lock..*/.vo
36ee0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
36ef0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
36f00 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54  ge *pPg){.  TEST
36f10 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61  ONLY( Pager *pPa
36f20 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
36f30 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20 70  r; ).  assert( p
36f40 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  Pg!=0 );.  if( p
36f50 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
36f60 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73  R_MMAP ){.    as
36f70 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
36f80 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20  =1 );  /* Page1 
36f90 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
36fa0 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61  mapped */.    pa
36fb0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
36fc0 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
36fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
36fe0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
36ff0 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20    }.  /* Do not 
37000 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
37010 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
37020 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  last reference t
37030 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73  o page1 */.  ass
37040 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
37050 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
37060 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
37070 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
37080 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
37090 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
370a0 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
370b0 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
370c0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
370d0 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f  3PagerUnrefPageO
370e0 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ne(DbPage *pPg){
370f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
37100 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
37110 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
37120 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  pPg->pgno==1 );.
37130 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
37140 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
37150 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67  AP)==0 ); /* Pag
37160 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f  e1 is never memo
37170 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70  ry mapped */.  p
37180 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
37190 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ger;.  sqlite3Pa
371a0 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65  gerResetLockTime
371b0 6f 75 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73  out(pPager);.  s
371c0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
371d0 61 73 65 28 70 50 67 29 3b 0a 20 20 70 61 67 65  ase(pPg);.  page
371e0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
371f0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
37200 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
37210 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
37220 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
37230 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
37240 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
37250 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
37260 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
37270 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
37280 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
37290 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
372a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
372b0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
372c0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
372d0 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
372e0 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
372f0 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
37300 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
37310 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
37320 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
37330 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
37340 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
37350 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37360 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
37370 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37380 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
37390 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
373a0 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
373b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
373c0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
373d0 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
373e0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
373f0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
37400 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
37410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
37420 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
37430 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
37440 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
37450 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
37460 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
37470 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
37480 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
37490 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
374a0 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
374b0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
374c0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
374d0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
374e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
374f0 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
37500 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
37510 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
37520 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
37530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
37540 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
37550 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
37560 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
37570 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
37580 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
37590 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
375a0 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
375b0 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
375c0 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
375d0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
375e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
375f0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
37600 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
37610 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
37620 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37630 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
37640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37650 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37660 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
37670 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
37680 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
37690 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
376a0 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
376b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
376c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
376d0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
376e0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
376f0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37700 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37720 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
37730 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
37740 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
37750 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
37760 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
37770 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
37780 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
37790 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
377a0 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
377b0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
377c0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
377d0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
377e0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
377f0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
37800 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37810 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
37820 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
37830 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
37840 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37850 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
37860 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37870 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
37880 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
37890 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
378a0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
378b0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
378c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
378d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
378e0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
378f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37900 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
37910 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
37920 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
37930 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
37940 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
37950 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
37960 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37970 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
37980 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
37990 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
379a0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
379b0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
379c0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
379d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
379e0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
379f0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  ;.        int nS
37a00 70 69 6c 6c 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pill;..#if SQLIT
37a10 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
37a20 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
37a30 20 66 6c 61 67 73 20 7c 3d 20 28 70 50 61 67 65   flags |= (pPage
37a40 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
37a50 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
37a60 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65  ECTION_MASK);.#e
37a70 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
37a80 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
37a90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  e ){.          f
37aa0 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
37ab0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
37ac0 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
37ad0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  EMP_JOURNAL);.  
37ae0 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d          nSpill =
37af0 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
37b00 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20  StmtSpill;.     
37b10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37b20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
37b30 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
37b40 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
37b50 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75   nSpill = jrnlBu
37b60 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
37b70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37b80 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f        .        /
37b90 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
37ba0 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c  e database still
37bb0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
37bc0 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65  me as it did whe
37bd0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  n.        ** it 
37be0 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  was originally o
37bf0 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  pened. */.      
37c00 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49    rc = databaseI
37c10 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
37c20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37c30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37c40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
37c50 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
37c60 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   (.             
37c70 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
37c80 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
37c90 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70  >jfd, flags, nSp
37ca0 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ill.          );
37cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37cc0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
37cd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
37ce0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
37cf0 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
37d00 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
37d10 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
37d20 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
37d30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
37d40 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
37d50 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
37d60 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
37d70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
37d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37d90 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
37da0 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
37db0 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
37dc0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
37dd0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
37de0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
37df0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
37e00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
37e10 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
37e20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
37e30 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
37e40 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
37e50 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
37e60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
37e70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37e80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
37e90 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
37ea0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
37eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
37ec0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
37ed0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
37ee0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37ef0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37f00 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
37f10 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
37f20 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37f30 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
37f40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
37f50 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
37f60 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
37f70 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
37f80 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
37f90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37fa0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
37fb0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
37fc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
37fd0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
37fe0 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
37ff0 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
38000 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
38010 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
38020 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
38030 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
38040 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
38050 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
38060 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
38070 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
38080 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
38090 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
380a0 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
380b0 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
380c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
380d0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
380e0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
380f0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
38100 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
38110 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
38120 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
38130 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
38140 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
38150 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
38160 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
38170 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
38180 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
38190 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
381a0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
381b0 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
381c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
381d0 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
381e0 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
381f0 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
38200 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
38210 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
38220 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
38230 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
38240 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
38250 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
38260 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
38270 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
38280 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
38290 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
382a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
382b0 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
382c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
382d0 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
382e0 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
382f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
38300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
38310 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
38320 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
38330 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
38340 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
38350 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
38360 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
38370 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
38380 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
38390 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
383a0 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
383b0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
383c0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
383d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
383e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
383f0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
38400 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
38410 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
38420 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
38430 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
38440 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
38450 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
38460 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
38470 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
38480 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
38490 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
384a0 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
384b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
384c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
384d0 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
384e0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
384f0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
38500 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
38510 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
38520 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
38530 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
38540 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38550 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
38560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
38570 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f 69    }.        (voi
38580 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  d)sqlite3WalExcl
38590 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
385a0 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20  ->pWal, 1);.    
385b0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72    }..      /* Gr
385c0 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ab the write loc
385d0 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  k on the log fil
385e0 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
385f0 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20  , upgrade to.   
38600 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45     ** PAGER_RESE
38610 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65  RVED state. Othe
38620 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
38630 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
38640 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
38650 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e   ** The busy-han
38660 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f  dler is not invo
38670 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63  ked if another c
38680 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64  onnection alread
38690 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73  y.      ** holds
386a0 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e   the write-lock.
386b0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
386c0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
386d0 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20  ll call it..    
386e0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
386f0 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57  sq