/ Hex Artifact Content
Login

Artifact e00e5844b1d61c0f1a44b09b26ab0be941ac9056c44b5973d8343ce80a3973d8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ges */.  int (*x
8460: 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f  Get)(Pager*,Pgno
8470: 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20  ,DbPage**,int); 
8480: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 66 65  /* Routine to fe
8490: 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f 0a 23  tch a patch */.#
84a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
84b0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
84c0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
84d0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
84e0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
84f0: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
8500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8510: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
8520: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
8530: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
8540: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
8550: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
8560: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
8570: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
8580: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
8590: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
85a0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
85b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
85c0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
85d0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
85e0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
85f0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
8600: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
8610: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
8620: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
8630: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
8640: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
8650: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
8660: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
8670: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8680: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
8690: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
86b0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
86c0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
86d0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
86e0: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8700: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
8710: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
8720: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dif.};../*.** In
8730: 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69  dexes for use wi
8740: 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  th Pager.aStat[]
8750: 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61  . The Pager.aSta
8760: 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  t[] array contai
8770: 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  ns.** the values
8780: 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73   accessed by pas
8790: 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54  sing SQLITE_DBST
87a0: 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20  ATUS_CACHE_HIT, 
87b0: 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f  CACHE_MISS .** o
87c0: 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f  r CACHE_WRITE to
87d0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
87e0: 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  us()..*/.#define
87f0: 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20   PAGER_STAT_HIT 
8800: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
8810: 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23  R_STAT_MISS  1.#
8820: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41  define PAGER_STA
8830: 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a  T_WRITE 2../*.**
8840: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8850: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8860: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8870: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8880: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
8890: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
88a0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
88b0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
88c0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
88d0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
88e0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
88f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8900: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8910: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8920: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8930: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8940: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8950: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8960: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8970: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8980: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
8990: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
89a0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
89b0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
89c0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
89d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
89e0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
89f0: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8a00: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8a10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8a20: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8a30: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8a40: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8a50: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8a60: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8a70: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8a80: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
8a90: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
8aa0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
8ab0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
8ac0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
8ad0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
8ae0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8af0: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8b00: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8b10: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8b20: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8b30: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8b50: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8b60: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8b70: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8b80: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
8b90: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
8ba0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
8bb0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
8bc0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
8bd0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
8be0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8bf0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8c00: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8c10: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8c20: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8c30: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8c40: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8c50: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8c60: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8c70: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8c80: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
8c90: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8ca0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
8cb0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8cc0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
8cd0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
8ce0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8cf0: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8d00: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8d10: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8d20: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8d30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8d40: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8d50: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8d60: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8d70: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8d80: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
8d90: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
8da0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
8db0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
8dc0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
8dd0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
8de0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8df0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8e00: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8e10: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8e20: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8e30: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8e40: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8e50: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8e60: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8e70: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8e80: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
8e90: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
8ea0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
8eb0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
8ec0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
8ed0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
8ee0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8ef0: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8f00: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8f10: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8f20: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8f30: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8f40: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8f50: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8f60: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8f70: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8f80: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8f90: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8fa0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8fb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8fc0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8fd0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8fe0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8ff0: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
9000: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
9010: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
9020: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
9030: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
9040: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
9050: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
9060: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
9070: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
9080: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
9090: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
90a0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
90b0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
90c0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
90d0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
90e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
90f0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
9100: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
9110: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
9120: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
9130: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
9140: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
9150: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
9160: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
9170: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
9180: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
9190: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
91a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
91b0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
91c0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
91d0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
91e0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
91f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
9200: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
9210: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
9220: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
9230: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
9240: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
9250: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
9260: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
9270: 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69  macro USEFETCH i
9280: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
9290: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20   allowed to use 
92a0: 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78  the xFetch and x
92b0: 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72  Unfetch.** inter
92c0: 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20  faces to access 
92d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
92e0: 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  ng memory-mapped
92f0: 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   I/O..*/.#if SQL
9300: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
9310: 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45  E>0.# define USE
9320: 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62  FETCH(x) ((x)->b
9330: 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a  UseFetch).#else.
9340: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
9350: 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  H(x) 0.#endif../
9360: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
9370: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
9380: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
9390: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
93a0: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
93b0: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68  483647../*.** Th
93c0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
93d0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
93e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
93f0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
9400: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
9410: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
9420: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
9430: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
9440: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
9450: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
9460: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
9470: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
9480: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
9490: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
94a0: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
94b0: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
94c0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
94d0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
94e0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
94f0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
9500: 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  ds!=0)../*.** Re
9510: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
9520: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
9530: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 74  rite-ahead log t
9540: 6f 20 72 65 61 64 20 70 61 67 65 20 70 67 6e 6f  o read page pgno
9550: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
9560: 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  e if the pager r
9570: 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65 63 74  eads pgno direct
9580: 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
9590: 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  base..*/.#if !de
95a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
95b0: 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69 6e 65  T_WAL) && define
95c0: 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  d(SQLITE_DIRECT_
95d0: 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29 0a 69  OVERFLOW_READ).i
95e0: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
95f0: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
9600: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
9610: 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d 20 30  .  u32 iRead = 0
9620: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
9630: 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
9640: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9650: 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
9660: 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
9670: 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 52  >pWal, pgno, &iR
9680: 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ead);.  return r
9690: 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a 23 65  c || iRead;.}.#e
96a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
96b0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20 64  ITE_OMIT_WAL.# d
96c0: 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61  efine pagerUseWa
96d0: 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61 6c 21  l(x) ((x)->pWal!
96e0: 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  =0).#else.# defi
96f0: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9700: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9710: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9720: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9730: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
9740: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
9750: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
9760: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
9770: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
9780: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
9790: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
97a0: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
97b0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
97c0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
97d0: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
97e0: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
97f0: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9800: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9810: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9820: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9830: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
9840: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
9850: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
9860: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
9870: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
9880: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
9890: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
98a0: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
98b0: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
98c0: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
98d0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
98e0: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
98f0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9900: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9910: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9920: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9930: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9940: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9950: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
9960: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9970: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
9980: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
9990: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
99a0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
99b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
99c0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
99d0: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
99e0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
99f0: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9a00: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9a10: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9a20: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9a30: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9a40: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9a50: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9a60: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
9a70: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
9a80: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
9a90: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
9aa0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
9ab0: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
9ac0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9ad0: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9ae0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9af0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9b00: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9b10: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9b20: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9b30: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9b40: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9b50: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9b60: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
9b70: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
9b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9b90: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
9ba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9bb0: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
9bc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9bd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9be0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9bf0: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9c00: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9c10: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9c20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9c30: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9c40: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9c50: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9c60: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
9c70: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
9c80: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
9c90: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
9ca0: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
9cb0: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
9cc0: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9cd0: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9ce0: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9cf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9d00: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9d10: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9d20: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9d30: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9d40: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9d50: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9d60: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
9d70: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
9d80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9d90: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
9da0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9db0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
9dc0: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9dd0: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9de0: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9df0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9e00: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9e10: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9e20: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9e30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
9e40: 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20  Open(p->fd) );. 
9e50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9e60: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9e70: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9e80: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9e90: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9ea0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9eb0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9ec0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9ed0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
9ee0: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
9ef0: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
9f00: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
9f10: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9f20: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9f30: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9f40: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9f50: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9f60: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9f70: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9f80: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9f90: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9fa0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9fb0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9fc0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9fd0: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9fe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9ff0: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
a000: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
a010: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
a020: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
a030: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
a040: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
a050: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a060: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a070: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a080: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
a090: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
a0a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
a0b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
a0c0: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
a0d0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a0e0: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
a0f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a100: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a110: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a120: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a130: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
a140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a150: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
a160: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72  LOCK );.      br
a170: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a180: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a190: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a1a0: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a1b0: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a1c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a1d0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a1e0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
a1f0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a200: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
a210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a220: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a230: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
a240: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a250: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
a260: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
a270: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a280: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a290: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a2a0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a2b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a2c0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a2d0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a2e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2f0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a300: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a310: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a320: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a330: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a340: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a350: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a360: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a370: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a380: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a390: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a3a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a3b0: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a3c0: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a3d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a3e0: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a3f0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a400: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a410: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a420: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a430: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a440: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a450: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a460: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a470: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a490: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a4a0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4d0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a4e0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a4f0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a500: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a510: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a520: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a530: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a540: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a550: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a560: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a580: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a590: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a5a0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a5c0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a5d0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a5e0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a5f0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a600: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a610: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a620: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a630: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a640: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a650: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a660: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a670: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a680: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a6a0: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a6b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a6c0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a6d0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a6e0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a6f0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a700: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a710: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a720: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a730: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a740: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a750: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a760: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a770: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a780: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a790: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a7a0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a7b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a7c0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a7d0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a7e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a7f0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a800: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a810: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a820: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a830: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a840: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a850: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a860: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a870: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a880: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a890: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a8a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a8b0: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a8c0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a8d0: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a8e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a8f0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a900: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a910: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a920: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a930: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a940: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a950: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a960: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a970: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a980: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a990: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a9a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a9b0: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a9c0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a9d0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a9e0: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a9f0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20  ->pPCache)>0 || 
aa00: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
aa10: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa20: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
aa30: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
aa40: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
aa50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
aa60: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
aa70: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
aa80: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
aa90: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
aaa0: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
aab0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
aac0: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
aad0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
aae0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
aaf0: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
ab00: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
ab10: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
ab20: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
ab30: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
ab40: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
ab50: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
ab60: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
ab70: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
ab80: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
ab90: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
aba0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
abb0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
abc0: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
abd0: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
abe0: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
abf0: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
ac00: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
ac10: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
ac20: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
ac30: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
ac40: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
ac50: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
ac60: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
ac70: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
ac80: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
ac90: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
aca0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
acb0: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
acc0: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
acd0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
ace0: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
acf0: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
ad00: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
ad10: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
ad20: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
ad30: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
ad40: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
ad50: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
ad60: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
ad70: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
ad80: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
ad90: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
ada0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
adb0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
adc0: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
add0: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
ade0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
adf0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
ae00: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
ae10: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ae20: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ae30: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
ae40: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
ae50: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ae60: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
ae70: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
ae80: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
ae90: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
aea0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
aeb0: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
aec0: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
aed0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
aee0: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
aef0: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
af00: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
af10: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
af20: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
af30: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
af40: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
af50: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
af60: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
af70: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
af80: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
af90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
afa0: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
afb0: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
afc0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
afd0: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
afe0: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
aff0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
b000: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
b010: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
b020: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
b030: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
b040: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
b050: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
b060: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b070: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
b080: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
b090: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
b0a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b0b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
b0c0: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
b0d0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b0e0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b0f0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
b100: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
b110: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b120: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b130: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
b140: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
b150: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b160: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b170: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
b180: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
b190: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b1a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b1b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
b1c0: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
b1d0: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b1e0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
b1f0: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
b200: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
b210: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
b220: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
b230: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
b240: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
b250: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
b260: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
b270: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
b280: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
b290: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  .}.#endif../* Fo
b2a0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
b2b0: 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
b2c0: 70 61 67 65 20 67 65 74 74 65 72 73 20 2a 2f 0a  page getters */.
b2d0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
b2e0: 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72 2a 2c  geNormal(Pager*,
b2f0: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b300: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 67  t);.static int g
b310: 65 74 50 61 67 65 45 72 72 6f 72 28 50 61 67 65  etPageError(Page
b320: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b330: 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c 49 54  ,int);.#if SQLIT
b340: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
b350: 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  0.static int get
b360: 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72 2a 2c  PageMMap(Pager*,
b370: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b380: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  t);.#endif../*.*
b390: 2a 20 53 65 74 20 74 68 65 20 50 61 67 65 72 2e  * Set the Pager.
b3a0: 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f 72 20  xGet method for 
b3b0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
b3c0: 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
b3d0: 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65 6e 74  fetch.** content
b3e0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
b3f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b400: 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
b410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b420: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
b430: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70 50 61  rCode ){.    pPa
b440: 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65 74 50  ger->xGet = getP
b450: 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20 53 51  ageError;.#if SQ
b460: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b470: 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69 66 28  ZE>0.  }else if(
b480: 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
b490: 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ).#ifdef SQLITE_
b4a0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20  HAS_CODEC.   && 
b4b0: 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d  pPager->xCodec==
b4c0: 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  0.#endif.  ){.  
b4d0: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b4e0: 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a 23 65   getPageMMap;.#e
b4f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
b500: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
b510: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  /.  }else{.    p
b520: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b530: 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20 20 7d  tPageNormal;.  }
b540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b550: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
b560: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
b570: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
b580: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b590: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
b5a0: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
b5b0: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b5c0: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
b5d0: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
b5e0: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
b5f0: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
b600: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
b610: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
b620: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
b630: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
b640: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
b650: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
b660: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
b670: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
b680: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
b690: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b6a0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
b6b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
b6c0: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
b6d0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b6e0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b6f0: 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72  >pPager;.  Pager
b700: 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20  Savepoint *p;.  
b710: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b720: 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a  >pgno;.  int i;.
b730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b740: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b750: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
b760: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b770: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b780: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b790: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b7a0: 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e  cTestNotNull(p->
b7b0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
b7c0: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
b7d0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
b7e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b7f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b800: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
b810: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
b820: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
b830: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b850: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 61  pageInJournal(Pa
b860: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
b870: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
b880: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
b890: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
b8a0: 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
b8b0: 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  no);.}.#endif../
b8c0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
b8d0: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
b8e0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b8f0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
b900: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
b910: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
b920: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
b930: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
b940: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
b950: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
b960: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
b970: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
b980: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
b990: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
b9a0: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
b9b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
b9c0: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
b9d0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b9e0: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
b9f0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
ba00: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
ba10: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
ba20: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
ba30: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
ba40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ba50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
ba60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
ba70: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
ba80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ba90: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
baa0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
bab0: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
bac0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
bad0: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
bae0: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
baf0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
bb00: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
bb10: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bb20: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bb30: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
bb40: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
bb50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
bb60: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
bb70: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
bb80: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
bb90: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
bba0: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
bbb0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
bbc0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
bbd0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
bbe0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
bbf0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
bc00: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
bc10: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
bc20: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
bc30: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bc40: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
bc50: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
bc60: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
bc70: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
bc80: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
bc90: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
bca0: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
bcb0: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
bcc0: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
bcd0: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
bce0: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
bcf0: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
bd00: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
bd10: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
bd20: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
bd30: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
bd40: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
bd50: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
bd60: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
bd70: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
bd80: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
bd90: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
bda0: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
bdb0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
bdc0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
bdd0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
bde0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
bdf0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
be00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
be10: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
be20: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
be30: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
be40: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
be50: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
be60: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
be70: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
be80: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
be90: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
bea0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
beb0: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
bec0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
bed0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
bee0: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
bef0: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50  k );.    rc = pP
bf00: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bf10: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bf20: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
bf30: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
bf40: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
bf50: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bf60: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
bf70: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
bf80: 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eLock;.    }.   
bf90: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
bfa0: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
bfb0: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a  er, eLock)).  }.
bfc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bfd0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64  /*.** Lock the d
bfe0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
bff0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
c000: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
c010: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a  r SHARED_LOCK,.*
c020: 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  * RESERVED_LOCK 
c030: 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
c040: 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  K. If the caller
c050: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
c060: 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  set the.** Pager
c070: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
c080: 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  to the new locki
c090: 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  ng state. .**.**
c0a0: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
c0b0: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
c0c0: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
c0d0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c0e0: 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c  n is .** called,
c0f0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c100: 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77  t unless the new
c110: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69   locking state i
c120: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
c130: 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f  . .** See the co
c140: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
c150: 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f  #define of UNKNO
c160: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
c170: 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f  xplanation .** o
c180: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
c190: 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44  c int pagerLockD
c1a0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c1b0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c1c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c1d0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c  K;..  assert( eL
c1e0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c1f0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   || eLock==RESER
c200: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  VED_LOCK || eLoc
c210: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c220: 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
c230: 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c  r->eLock<eLock |
c240: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
c250: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
c260: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
c270: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
c280: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
c290: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
c2a0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
c2b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c2c0: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
c2d0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
c2e0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c2f0: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
c300: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
c310: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
c320: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
c330: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
c340: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
c350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c370: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
c380: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
c390: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
c3a0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
c3b0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
c3c0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
c3d0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
c3e0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
c3f0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
c400: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
c410: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
c420: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
c430: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
c440: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
c450: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
c460: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
c470: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
c480: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c490: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
c4a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
c4b0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
c4c0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
c4d0: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
c4e0: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
c4f0: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
c500: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
c510: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
c520: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
c530: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
c540: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
c550: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
c560: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
c570: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
c580: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
c590: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
c5a0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
c5b0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
c5c0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c5d0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
c5e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c5f0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
c600: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
c610: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
c620: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
c630: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c640: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
c650: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
c660: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
c670: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
c680: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
c690: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
c6a0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
c6b0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6d0: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
c6e0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
c6f0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
c720: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
c730: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c740: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
c750: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
c760: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
c770: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
c780: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
c790: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c7a0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
c7b0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
c7c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c7d0: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
c7e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c7f0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
c800: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c810: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
c820: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c830: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
c840: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
c850: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
c860: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c870: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
c880: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
c890: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
c8a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
c8b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
c8c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c8d0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
c8e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
c8f0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6a 72 6e  lse.# define jrn
c900: 6c 42 75 66 66 65 72 53 69 7a 65 28 78 29 20 30  lBufferSize(x) 0
c910: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c920: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c930: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
c940: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
c950: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
c960: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
c970: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
c980: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
c990: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
c9a0: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
c9b0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
c9c0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c9d0: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
c9e0: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
c9f0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
ca00: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
ca10: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
ca20: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
ca30: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
ca40: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
ca50: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
ca60: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ca70: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
ca80: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
ca90: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
caa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
cab0: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
cac0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cad0: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
cae0: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
caf0: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
cb00: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
cb10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
cb20: 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a  )pPage->pData);.
cb30: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
cb40: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
cb50: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
cb60: 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73    pPage->pageHas
cb70: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
cb80: 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  sh(pPage);.}../*
cb90: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
cba0: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
cbb0: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
cbc0: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
cbd0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
cbe0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
cbf0: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
cc00: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
cc10: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
cc20: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
cc30: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
cc40: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
cc50: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
cc60: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
cc70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
cc80: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
cc90: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
cca0: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
ccb0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
ccc0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
ccd0: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
cce0: 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
ccf0: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
cd00: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ;.  assert( (pPg
cd10: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
cd20: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
cd30: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
cd40: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
cd50: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
cd60: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
cd70: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
cd80: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
cd90: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
cda0: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29  _set_pagehash(X)
cdb0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
cdc0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
cdd0: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
cde0: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
cdf0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
ce00: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
ce10: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
ce20: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
ce30: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
ce40: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
ce50: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
ce60: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ce70: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
ce80: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
ce90: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
cea0: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
ceb0: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
cec0: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
ced0: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
cee0: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
cef0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
cf00: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
cf10: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
cf20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cf30: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
cf40: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
cf50: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
cf60: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
cf70: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
cf80: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
cf90: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
cfa0: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
cfb0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
cfc0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
cfd0: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
cfe0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
cff0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
d000: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
d010: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
d020: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d030: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
d040: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
d050: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
d060: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
d070: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
d080: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
d090: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
d0a0: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
d0b0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
d0c0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
d0d0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d0e0: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d100: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
d110: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
d120: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
d130: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
d140: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
d150: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
d160: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
d170: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
d180: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
d190: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
d1a0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
d1b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d1c0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
d1d0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
d1e0: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
d1f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d200: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
d210: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
d220: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
d230: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
d240: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d250: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
d260: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
d270: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
d280: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
d290: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
d2a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d2b0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
d2c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
d2d0: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
d2e0: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
d2f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d310: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
d320: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d340: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
d350: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
d360: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
d370: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
d380: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
d390: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
d3a0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
d3b0: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
d3c0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
d3d0: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
d3e0: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
d3f0: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
d400: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
d410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
d420: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
d430: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
d440: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
d450: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
d460: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
d470: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
d480: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
d490: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
d4a0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d4b0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
d4c0: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
d4d0: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
d4e0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
d4f0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
d500: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
d510: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
d520: 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20  r .   || len==0 
d530: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d540: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
d550: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
d560: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
d570: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d580: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d590: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
d5a0: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
d5b0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
d5c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
d5d0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d5e0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
d5f0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
d600: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
d610: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
d620: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d630: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
d640: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
d650: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d660: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
d670: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
d680: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
d690: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
d6a0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
d6b0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
d6c0: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
d6d0: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
d6e0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
d6f0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
d700: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
d710: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d720: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
d730: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
d740: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
d750: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
d760: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
d770: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
d780: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
d790: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
d7a0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
d7b0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
d7c0: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
d7d0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
d7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d7f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
d800: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
d810: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
d820: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
d830: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
d840: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
d850: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
d860: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
d870: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
d880: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
d890: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
d8a0: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
d8b0: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
d8c0: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
d8d0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
d8e0: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
d8f0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d920: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
d940: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d960: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
d9b0: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
d9c0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
d9d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d9e0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
d9f0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
da00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
da10: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
da20: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
da30: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
da40: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
da50: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
da60: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
da70: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
da80: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
da90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
daa0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
dab0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
dac0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
dad0: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
dae0: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
daf0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
db00: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
db10: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
db20: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
db30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
db40: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
db50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
db60: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
db70: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
db80: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
db90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
dba0: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
dbb0: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
dbc0: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
dbd0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
dbe0: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
dbf0: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
dc00: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
dc10: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
dc20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
dc30: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
dc40: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
dc50: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
dc60: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
dc70: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
dc80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
dc90: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
dca0: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
dcb0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
dcc0: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
dcd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
dce0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
dcf0: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
dd00: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
dd10: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
dd20: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
dd30: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
dd40: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
dd50: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
dd60: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
dd70: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
dd80: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
dd90: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
dda0: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
ddb0: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
ddc0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
ddd0: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
dde0: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
ddf0: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
de00: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
de10: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
de20: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
de30: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
de40: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
de50: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
de60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
de70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
de80: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
de90: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
dea0: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
deb0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
dec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
ded0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
dee0: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
def0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
df00: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
df10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
df20: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
df50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
df60: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
df70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
df80: 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
df90: 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
dfa0: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
dfb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
dfc0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
dfd0: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
dfe0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
dff0: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
e000: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
e010: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
e020: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
e030: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
e040: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
e050: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
e060: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e070: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e080: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
e090: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
e0a0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
e0b0: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
e0c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e0d0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
e0e0: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
e0f0: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
e100: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
e110: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e120: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
e130: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
e140: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
e150: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
e160: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
e170: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  Y|pPager->syncFl
e180: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
e190: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e1a0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
e1b0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
e1c0: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
e1d0: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
e1e0: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
e1f0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
e200: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
e210: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
e220: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
e230: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
e240: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e250: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
e260: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
e270: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
e280: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
e290: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
e2a0: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
e2b0: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
e2c0: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
e2d0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
e2e0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
e2f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e300: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
e310: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
e320: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e330: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
e340: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
e350: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e360: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
e370: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
e380: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e390: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e3a0: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
e3b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e3c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e3d0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
e3e0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
e3f0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
e400: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
e410: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
e420: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
e430: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
e440: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
e450: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
e460: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
e470: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
e480: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
e490: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e4a0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
e4b0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
e4c0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
e4d0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
e4e0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
e4f0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
e500: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
e510: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
e520: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
e530: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
e540: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
e550: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
e560: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
e570: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
e580: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
e590: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
e5a0: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
e5b0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
e5c0: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
e5d0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
e5e0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
e5f0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
e600: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
e610: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
e620: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
e630: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
e640: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
e650: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
e660: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e680: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e690: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
e6a0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e6b0: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
e6c0: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
e6d0: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
e6e0: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
e6f0: 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
e700: 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66  eSize;/* Size of
e710: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
e720: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
e730: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e760: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
e770: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
e780: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e7b0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
e7c0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e7d0: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
e7e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e7f0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
e800: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
e810: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e820: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
e830: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
e840: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
e850: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
e860: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
e870: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
e880: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
e890: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
e8a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
e8b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
e8c0: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
e8d0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
e8e0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
e8f0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
e900: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
e910: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
e920: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
e930: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e940: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
e950: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
e960: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
e970: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
e980: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
e990: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
e9a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
e9b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
e9c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e9d0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
e9e0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
e9f0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
ea00: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
ea10: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
ea20: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
ea30: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
ea40: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
ea50: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
ea60: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
ea70: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
ea80: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
ea90: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
eaa0: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
eab0: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
eac0: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
ead0: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
eae0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
eaf0: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
eb00: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
eb10: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
eb20: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
eb30: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
eb40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
eb50: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
eb60: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
eb70: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
eb80: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
eb90: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
eba0: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
ebb0: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
ebc0: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
ebd0: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
ebe0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ebf0: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
ec00: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
ec10: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
ec20: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
ec30: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
ec40: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
ec50: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
ec60: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
ec70: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
ec80: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
ec90: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
eca0: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
ecb0: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
ecc0: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
ecd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
ece0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
ecf0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
ed00: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
ed10: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
ed20: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
ed30: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
ed40: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
ed50: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
ed60: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
ed70: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
ed80: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
ed90: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
eda0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
edb0: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
edc0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
edd0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
ede0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
edf0: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
ee00: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
ee10: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
ee20: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
ee30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ee40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
ee50: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
ee60: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
ee70: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
ee80: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
ee90: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
eea0: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
eeb0: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
eec0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
eed0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
eee0: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
eef0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ef00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
ef10: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
ef20: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
ef30: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
ef40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ef50: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
ef60: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
ef70: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a  k-hash initializ
ef80: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
ef90: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
efa0: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
efb0: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
efc0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
efd0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
efe0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
eff0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
f000: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
f010: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
f020: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
f030: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f040: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f050: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
f060: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
f070: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
f080: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
f090: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
f0a0: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
f0b0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f0c0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f0d0: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
f0e0: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
f0f0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
f100: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
f110: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f120: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
f130: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
f140: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
f150: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
f160: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
f170: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
f180: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
f190: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
f1a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
f1b0: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
f1c0: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
f1d0: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
f1e0: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
f1f0: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
f200: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
f210: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
f220: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
f230: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
f240: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
f250: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f260: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
f270: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
f280: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
f290: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
f2a0: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
f2b0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
f2c0: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
f2d0: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
f2e0: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
f2f0: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
f300: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
f310: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
f320: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
f330: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
f340: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
f350: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
f360: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
f370: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
f380: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
f390: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
f3a0: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
f3b0: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
f3c0: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
f3d0: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
f3e0: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
f3f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
f400: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
f410: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
f420: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
f430: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
f440: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
f450: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
f460: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
f470: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f480: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
f490: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
f4a0: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
f4b0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f4c0: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
f4d0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
f4e0: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
f4f0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
f500: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
f510: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
f520: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
f530: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
f540: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
f550: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
f560: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
f570: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
f580: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
f590: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
f5a0: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
f5b0: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
f5c0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
f5d0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
f5e0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
f5f0: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
f600: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
f610: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
f620: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f630: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
f640: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
f650: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
f660: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
f670: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
f680: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
f690: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
f6a0: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
f6b0: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
f6c0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
f6d0: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
f6e0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
f6f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
f700: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
f710: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f720: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f730: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f740: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
f750: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
f760: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f770: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
f780: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
f790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
f7a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
f7b0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
f7c0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
f7d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
f7e0: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
f7f0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
f800: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
f810: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
f830: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
f840: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f850: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
f860: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
f870: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f880: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
f890: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
f8a0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
f8b0: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
f8c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
f8d0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
f8e0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
f8f0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
f900: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
f910: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
f920: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
f930: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
f940: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
f950: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
f960: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
f970: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
f980: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
f990: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
f9a0: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
f9b0: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
f9c0: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
f9d0: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
f9e0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f9f0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
fa00: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
fa10: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
fa20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
fa30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
fa40: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
fa50: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
fa60: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
fa70: 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
fa80: 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
fa90: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
faa0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
fab0: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
fac0: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
fad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
fae0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
faf0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
fb00: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
fb10: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
fb20: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
fb30: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
fb40: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
fb50: 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
fb60: 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
fb70: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
fb80: 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
fb90: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
fba0: 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
fbd0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
fbe0: 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
fbf0: 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
fc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
fc10: 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
fc20: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
fc30: 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
fc40: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc60: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
fc70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
fc80: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
fc90: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
fca0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
fcb0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
fcc0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
fcd0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
fce0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fcf0: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
fd00: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
fd10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
fd20: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
fd30: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
fd40: 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
fd50: 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
fd60: 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
fd70: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
fd80: 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
fd90: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
fda0: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
fdb0: 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
fdc0: 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
fdd0: 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
fde0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
fdf0: 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
fe00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
fe10: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
fe20: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
fe30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fe40: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
fe50: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
fe60: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
fe70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
fe80: 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
fe90: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
fea0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
feb0: 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
fec0: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
fed0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
fee0: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
fef0: 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
ff00: 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
ff10: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
ff20: 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
ff30: 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
ff40: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
ff50: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
ff60: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
ff70: 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
ff80: 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
ff90: 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
ffa0: 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
ffb0: 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
ffc0: 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
ffd0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
ffe0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
fff0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
10000 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
10010 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10030 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
10040 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
10050 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
10060 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
10070 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10080 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
10090 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
100a0 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
100b0 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
100c0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
100d0 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
100e0 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
100f0 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
10100 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
10110 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
10120 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
10130 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
10140 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
10150 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
10160 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
10170 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
10180 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10190 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
101a0 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
101b0 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
101c0 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
101d0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
101e0 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
101f0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
10200 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
10210 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10220 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10230 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
10240 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
10250 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
10270 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
10280 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
102a0 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
102b0 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
102c0 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
102d0 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
102e0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
102f0 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
10300 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
10310 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
10320 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10330 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
10340 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
10350 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
10360 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
10370 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
10380 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10390 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
103a0 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
103b0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
103c0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
103d0 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
103e0 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
103f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10400 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
10410 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53  /* Versions of S
10420 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
10430 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67  .5.8 set the pag
10440 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
10450 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
10460 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72  al header to zer
10470 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  o. In this case,
10480 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
10490 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
104a0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
104b0 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
104c0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  o the correct pa
104d0 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  ge size..    */.
104e0 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
104f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  e==0 ){.      iP
10500 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
10510 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
10520 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
10530 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
10540 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
10550 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
10560 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
10570 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
10580 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
10590 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
105a0 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
105b0 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
105c0 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
105d0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
105e0 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
105f0 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
10600 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
10610 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
10620 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
10630 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
10640 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
10650 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
10660 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
10670 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
10680 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10690 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
106a0 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
106b0 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
106c0 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
106d0 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
106e0 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
106f0 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
10700 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
10710 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
10720 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
10730 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
10740 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
10750 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
10760 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
10770 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
10780 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
10790 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
107a0 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
107b0 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
107c0 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
107d0 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
107e0 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
107f0 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
10800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
10810 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
10820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10830 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
10840 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
10850 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
10860 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
10870 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10880 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
10890 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
108a0 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
108b0 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
108c0 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
108d0 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
108e0 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
108f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
10900 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10910 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
10920 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b  &iPageSize, -1);
10930 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
10940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
10950 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
10960 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
10970 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
10980 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
10990 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
109a0 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
109b0 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
109c0 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
109d0 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
109e0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
109f0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
10a00 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
10a10 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
10a20 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
10a30 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
10a40 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
10a50 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
10a60 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
10a70 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
10a80 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
10a90 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
10aa0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
10ab0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
10ac0 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
10ad0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
10ae0 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
10af0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10b00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10b10 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
10b20 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
10b30 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10b40 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
10b50 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
10b60 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
10b70 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
10b80 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
10b90 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
10ba0 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
10bb0 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
10bc0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10bd0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
10be0 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
10bf0 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
10c00 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10c10 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
10c20 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
10c30 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
10c40 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
10c50 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
10c60 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
10c70 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
10c80 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
10c90 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
10ca0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
10cb0 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
10cc0 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
10cd0 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
10ce0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
10cf0 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
10d00 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
10d10 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
10d20 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
10d30 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
10d40 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
10d50 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
10d60 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10d70 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
10d80 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
10d90 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
10da0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
10db0 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
10dc0 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
10dd0 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
10de0 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
10df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
10e00 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
10e10 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
10e20 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
10e30 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
10e40 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
10e50 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10e60 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
10e70 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
10e80 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10e90 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10ea0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10ed0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
10ee0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
10ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
10f00 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
10f10 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
10f20 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
10f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10f40 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
10f50 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
10f60 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
10f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
10fa0 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
10fb0 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
10fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
10fd0 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
10fe0 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61   zMaster */..  a
10ff0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11000 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
11010 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
11020 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
11030 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
11040 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
11050 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
11060 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11070 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73  EMORY .   || !is
11080 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11090 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
110a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
110b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
110c0 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
110d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
110e0 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
110f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
11100 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
11110 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
11120 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
11130 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
11140 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
11150 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
11160 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
11170 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
11180 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
11190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
111a0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
111b0 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
111c0 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
111d0 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
111e0 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
111f0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
11200 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
11210 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
11220 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
11230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
11240 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
11250 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
11260 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
11270 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11280 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
11290 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
112a0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
112b0 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
112c0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
112d0 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
112e0 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
112f0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
11300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
11310 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
11320 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
11330 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
11340 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
11350 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
11360 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11370 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11380 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
11390 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
113a0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
113b0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
113c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
113d0 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
113e0 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
113f0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11400 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11410 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11420 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
11430 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
11440 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11450 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11460 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11470 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
11480 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11490 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
114a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
114b0 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20  rnalMagic, 8,.  
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
114e0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
114f0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
11500 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
11510 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11520 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
11530 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
11540 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
11550 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
11560 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
11570 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
11580 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
11590 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
115a0 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
115b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
115c0 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
115d0 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
115e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
115f0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
11600 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
11610 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
11620 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
11630 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
11640 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
11650 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
11660 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
11670 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
11680 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
11690 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
116a0 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
116b0 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
116c0 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
116d0 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
116e0 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
116f0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
11700 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
11710 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
11720 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
11730 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
11740 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
11750 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
11760 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
11770 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
11780 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
11790 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
117a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
117b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
117c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
117d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
117e0 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
117f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
11800 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
11810 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
11820 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
11830 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11840 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56    pPager->iDataV
11850 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69  ersion++;.  sqli
11860 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
11870 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
11880 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
11890 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
118a0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
118b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50  ** Return the pP
118c0 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
118d0 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20  on value.*/.u32 
118e0 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61  sqlite3PagerData
118f0 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70  Version(Pager *p
11900 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
11910 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
11920 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  >PAGER_OPEN );. 
11930 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
11940 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a  iDataVersion;.}.
11950 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11960 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11970 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11980 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11990 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
119a0 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
119b0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
119c0 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
119d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
119e0 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
119f0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
11a00 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11a10 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11a20 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11a30 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
11a40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11a50 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11a60 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11a70 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11a80 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11a90 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11aa0 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11ab0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11ac0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11ad0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11ae0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
11af0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
11b00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11b10 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11b20 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75  de || sqlite3Jou
11b30 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
11b40 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11b50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11b60 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11b70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11b80 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11b90 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11ba0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11bb0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11bc0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11bd0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11be0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
11bf0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
11c00 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
11c10 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
11c20 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
11c30 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
11c40 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11c60 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11c70 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11c80 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11c90 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11ca0 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11cb0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11cc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11cd0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11ce0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11cf0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11d00 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11d10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11d20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11d30 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
11d40 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11d50 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11d60 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11d70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11d80 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11d90 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11da0 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11db0 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11dc0 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11dd0 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11de0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11df0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11e00 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
11e10 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11e20 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
11e30 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
11e40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11e50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11e60 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11e70 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11e80 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11e90 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11ea0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11eb0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11ec0 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11ed0 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11ee0 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
11ef0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
11f00 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11f10 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
11f20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11f30 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
11f40 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11f50 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11f60 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11f70 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11f80 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11f90 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11fa0 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11fb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11fc0 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11fd0 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11fe0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11ff0 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
12000 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
12010 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12020 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
12030 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12040 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
12050 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
12060 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
12070 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
12080 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
12090 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
120a0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
120b0 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
120c0 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
120d0 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
120e0 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
120f0 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
12100 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
12110 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
12120 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
12130 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
12140 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
12150 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
12160 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
12170 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
12180 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
12190 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
121a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
121b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
121c0 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
121d0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
121e0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
121f0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
12200 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
12210 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
12220 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
12230 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
12240 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
12250 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
12260 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
12270 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
12280 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
12290 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
122a0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
122b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
122c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
122d0 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
122e0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
122f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
12300 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12310 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
12320 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
12330 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
12340 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
12360 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
12370 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
12380 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
12390 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
123a0 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
123b0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
123c0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
123d0 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
123e0 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
123f0 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
12400 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
12410 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
12420 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
12430 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
12440 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
12450 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
12460 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
12470 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
12480 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
12490 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
124a0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
124b0 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
124c0 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
124d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
124e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
124f0 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
12500 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12510 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12520 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
12530 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12540 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12550 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
12560 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12570 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12580 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
12590 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
125a0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
125b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
125c0 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
125d0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
125e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
125f0 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
12600 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
12610 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
12620 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
12630 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
12640 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
12650 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
12660 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
12670 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
12680 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
12690 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
126a0 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
126b0 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
126c0 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
126d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
126e0 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
126f0 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
12700 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
12710 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
12720 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
12730 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
12740 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
12750 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
12760 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
12770 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
12780 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
12790 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
127a0 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
127b0 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
127c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
127d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
127e0 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
127f0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
12800 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
12810 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
12820 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
12830 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
12840 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
12850 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
12860 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
12870 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
12880 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
12890 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
128a0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
128b0 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
128c0 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
128d0 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
128e0 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
128f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12900 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
12910 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
12920 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
12930 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
12940 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12950 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12960 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12970 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12980 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12990 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
129a0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
129b0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
129c0 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
129d0 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
129e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
129f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
12a00 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
12a10 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
12a20 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
12a30 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
12a40 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12a50 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12a60 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12a70 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
12a80 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12a90 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
12aa0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
12ab0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12ac0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
12ad0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
12ae0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
12af0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
12b00 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12b10 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12b20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12b30 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12b40 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EN;.    }else{. 
12b50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
12b60 61 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50  ate = (isOpen(pP
12b70 61 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47  ager->jfd) ? PAG
12b80 45 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f  ER_OPEN : PAGER_
12b90 52 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20  READER);.    }. 
12ba0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
12bb0 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
12bc0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
12bd0 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
12be0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12bf0 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
12c00 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68     setGetterMeth
12c10 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  od(pPager);.  }.
12c20 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12c30 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
12c40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
12c50 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
12c60 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a  etMaster = 0;.}.
12c70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12c80 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
12c90 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52  henever an IOERR
12ca0 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74   or FULL error t
12cb0 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20  hat requires.** 
12cc0 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61  the pager to tra
12cd0 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  nsition into the
12ce0 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79   ERROR state may
12cf0 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a   ahve occurred..
12d00 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
12d10 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
12d20 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
12d30 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73  structure, the s
12d40 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72  econd .** the er
12d50 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
12d60 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
12d70 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
12d80 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76  ction. The .** v
12d90 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
12da0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
12db0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
12dc0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
12dd0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
12de0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12df0 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53  s SQLITE_FULL, S
12e00 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f  QLITE_IOERR or o
12e10 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45  ne of the.** IOE
12e20 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68  RR sub-codes, th
12e30 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74  e pager enters t
12e40 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
12e50 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
12e60 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69  e.** is stored i
12e70 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12e80 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
12e90 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20   remains in the 
12ea0 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20  ERROR state,.** 
12eb0 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61  all major API ca
12ec0 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72  lls on the Pager
12ed0 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
12ee0 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65  y return Pager.e
12ef0 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  rrCode..**.** Th
12f00 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  e ERROR state in
12f10 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
12f20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12f30 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
12f40 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
12f50 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
12f60 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
12f70 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
12f80 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
12f90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12fa0 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
12fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
12fc0 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
12fd0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
12fe0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74  rror occurred, t
12ff0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
13000 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
13010 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
13020 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  yed to restore t
13030 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
13040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13050 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65   (as if.** it we
13060 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  re a hot-journal
13070 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
13080 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
13090 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
130a0 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
130b0 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
130c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
130d0 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  _OK || !MEMDB );
130e0 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
130f0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
13100 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
13110 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
13120 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
13130 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
13140 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
13150 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
13160 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20  OERR.  );.  if( 
13170 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
13180 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   || rc2==SQLITE_
13190 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61  IOERR ){.    pPa
131a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
131b0 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  c;.    pPager->e
131c0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52  State = PAGER_ER
131d0 52 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74  ROR;.    setGett
131e0 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
131f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13200 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
13210 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
13220 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
13230 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a  gno nPage);../*.
13240 2a 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61  ** The write tra
13250 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e  nsaction open on
13260 20 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67   pPager is being
13270 20 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d   committed (bCom
13280 6d 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f  mit==1).** or ro
13290 6c 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d  lled back (bComm
132a0 69 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  it==0)..**.** Re
132b0 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64  turn TRUE if and
132c0 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72   only if all dir
132d0 74 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20  ty pages should 
132e0 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  be flushed to di
132f0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a  sk..**.** Rules:
13300 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20  .**.**   *  For 
13310 6e 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73  non-TEMP databas
13320 65 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20  es, always sync 
13330 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69  to disk.  This i
13340 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20  s necessary.**  
13350 20 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74      for transact
13360 69 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62  ions to be durab
13370 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53  le..**.**   *  S
13380 79 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73  ync TEMP databas
13390 65 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d  e only on a COMM
133a0 49 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41  IT (not a ROLLBA
133b0 43 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63  CK) when the bac
133c0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c  king.**      fil
133d0 65 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  e has been creat
133e0 65 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20  ed already (via 
133f0 61 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72  a spill on pager
13400 53 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a  Stress()) and.**
13410 20 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e        when the n
13420 75 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70  umber of dirty p
13430 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65  ages in memory e
13440 78 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68  xceeds 25% of th
13450 65 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20  e total.**      
13460 63 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73  cache size..*/.s
13470 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46  tatic int pagerF
13480 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67  lushOnCommit(Pag
13490 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
134a0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20  bCommit){.  if( 
134b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
134c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
134d0 20 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29    if( !bCommit )
134e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
134f0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
13500 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b  >fd) ) return 0;
13510 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74  .  return (sqlit
13520 65 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44  e3PCachePercentD
13530 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
13540 61 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f  ache)>=25);.}../
13550 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13560 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
13570 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
13580 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
13590 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
135a0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
135b0 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
135c0 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
135d0 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
135e0 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
135f0 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
13600 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
13610 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
13620 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
13630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13640 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
13650 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13660 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13670 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13680 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
13690 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
136a0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
136b0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
136c0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
136d0 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
136e0 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
136f0 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
13700 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
13710 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
13720 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13730 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
13740 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
13750 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13760 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13770 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13780 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13790 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
137a0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
137b0 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
137c0 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
137d0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
137e0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
137f0 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
13800 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
13810 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
13820 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
13830 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
13840 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
13850 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
13860 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13870 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
13880 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
13890 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
138a0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
138b0 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
138c0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
138d0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
138e0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
138f0 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13900 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13910 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13920 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13930 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13940 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13950 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13960 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
13970 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
13980 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
13990 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
139a0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
139b0 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
139c0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
139d0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
139e0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
139f0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13a00 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13a10 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13a20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13a30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13a40 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
13a50 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13a60 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13a70 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13a80 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
13a90 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
13aa0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13ab0 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13ac0 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13ad0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
13ae0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13af0 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13b00 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13b10 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13b20 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13b30 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13b40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
13b50 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13b60 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13b70 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13b80 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
13b90 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
13ba0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13bb0 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13bc0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13bd0 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
13be0 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13bf0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13c00 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13c10 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13c20 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13c30 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13c40 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
13c50 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13c60 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13c70 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13c80 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
13c90 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
13ca0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13cb0 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13cc0 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13cd0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13ce0 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13cf0 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13d00 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13d10 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13d20 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13d30 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13d40 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
13d50 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13d60 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13d70 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13d80 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
13d90 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
13da0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13db0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13dc0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13dd0 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
13de0 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13df0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13e00 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13e10 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13e20 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13e30 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13e40 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13e50 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13e60 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13e70 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13e80 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
13e90 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
13ea0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13eb0 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13ec0 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13ed0 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
13ee0 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13ef0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13f00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13f10 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13f20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13f30 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13f40 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13f50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13f60 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13f70 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13f80 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
13f90 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
13fa0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13fb0 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13fc0 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13fd0 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13fe0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13ff0 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
14000 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
14010 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
14020 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
14030 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
14040 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
14050 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
14060 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
14070 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
14080 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
14090 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
140a0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
140b0 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
140c0 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
140d0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
140e0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
140f0 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
14100 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
14110 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
14120 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
14130 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
14140 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
14150 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
14160 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
14170 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
14180 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
14190 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
141a0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
141b0 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
141c0 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
141d0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
141e0 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
141f0 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
14200 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
14210 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
14220 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
14230 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
14240 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
14250 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
14260 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
14270 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
14280 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
14290 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
142a0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
142b0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
142c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
142d0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
142e0 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
142f0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
14300 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
14310 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
14320 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
14330 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14340 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
14350 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
14360 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
14370 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
14380 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
14390 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
143a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
143b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
143c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
143d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
143e0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
143f0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
14400 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
14410 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
14420 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
14430 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
14440 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
14450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14460 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14470 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20  LMODE_MEMORY ); 
14480 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
14490 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
144a0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
144b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
144c0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
144d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
144e0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
144f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14500 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
14510 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14530 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14540 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
14550 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
14560 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14570 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
14580 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
14590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
145a0 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66  e sure the new f
145b0 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74  ile size is writ
145c0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f  ten into the ino
145d0 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  de right away.. 
145e0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65           ** Othe
145f0 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  rwise the journa
14600 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63  l might resurrec
14610 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  t following a po
14620 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20  wer loss and.   
14630 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
14640 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63  the last transac
14650 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63  tion to roll bac
14660 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20  k.  See.        
14670 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67    ** https://bug
14680 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72  zilla.mozilla.or
14690 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  g/show_bug.cgi?i
146a0 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20  d=1072773.      
146b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
146c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
146d0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
146e0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
146f0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gs);.        }. 
14700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
14710 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14720 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
14730 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14740 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14750 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14760 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
14770 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14780 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
14790 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
147a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
147b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
147c0 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
147d0 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
147e0 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ter||pPager->tem
147f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50  pFile);.      pP
14800 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14810 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
14820 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
14830 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
14840 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
14850 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
14860 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
14870 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
14880 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
14890 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
148a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
148b0 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
148c0 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
148d0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
148e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
148f0 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
14900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14910 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
14920 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
14930 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ory journal..   
14940 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
14950 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65  bDelete = !pPage
14960 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20  r->tempFile;.   
14970 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14980 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
14990 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ory(pPager->jfd)
149a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
149b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
149c0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
149d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
149e0 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
149f0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14a00 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14a10 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
14a20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
14a30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14a40 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14a50 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
14a60 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14a70 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
14a80 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
14a90 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20   bDelete ){.    
14aa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14ab0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
14ac0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
14ad0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
14ae0 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20  >extraSync);.   
14af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14b00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
14b10 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69  ECK_PAGES.  sqli
14b20 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
14b30 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
14b40 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74  Cache, pager_set
14b50 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66  _pagehash);.  if
14b60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
14b70 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63  ==0 && sqlite3Pc
14b80 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
14b90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
14ba0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
14bb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
14bc0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
14bd0 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
14be0 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20      p->pageHash 
14bf0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
14c00 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
14c10 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ull(p);.    }.  
14c20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
14c30 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
14c40 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
14c50 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
14c60 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
14c70 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
14c80 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   0;.  if( rc==SQ
14c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14ca0 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65  f( MEMDB || page
14cb0 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70  rFlushOnCommit(p
14cc0 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20  Pager, bCommit) 
14cd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14ce0 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
14cf0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
14d00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14d10 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
14d20 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70 50 61  learWritable(pPa
14d30 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
14d40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14d50 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
14d60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14d70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
14d80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
14d90 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
14da0 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  ){.    /* Drop t
14db0 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63  he WAL write-loc
14dc0 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c  k, if any. Also,
14dd0 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
14de0 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a  on was in .    *
14df0 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  * locking_mode=e
14e00 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75  xclusive mode bu
14e10 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20  t is no longer, 
14e20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49  drop the EXCLUSI
14e30 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  VE .    ** lock 
14e40 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
14e50 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
14e60 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  /.    rc2 = sqli
14e70 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72  te3WalEndWriteTr
14e80 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
14e90 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73  ->pWal);.    ass
14ea0 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45  ert( rc2==SQLITE
14eb0 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  _OK );.  }else i
14ec0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14ed0 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70   && bCommit && p
14ee0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
14ef0 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e>pPager->dbSize
14f00 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
14f10 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
14f20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
14f30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
14f40 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
14f50 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66  l.    ** mode if
14f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14f70 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61  le on disk is la
14f80 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61  rger than the da
14f90 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
14fa0 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69    ** At this poi
14fb0 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  nt the journal h
14fc0 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
14fd0 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  d and the transa
14fe0 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75  ction .    ** su
14ff0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69  ccessfully commi
15000 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45 58  tted, but the EX
15010 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
15020 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
15030 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53  e.    ** file. S
15040 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
15050 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
15060 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74  abase file to it
15070 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  s minimum.    **
15080 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20   required size. 
15090 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
150a0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
150b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
150c0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
150d0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
150e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
150f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
15100 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
15110 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28  ommit && isOpen(
15120 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
15130 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15140 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
15150 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
15160 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41  FCNTL_COMMIT_PHA
15170 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69  SETWO, 0);.    i
15180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15190 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
151a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
151b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
151c0 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
151d0 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28  & (!pagerUseWal(
151e0 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74  pPager) || sqlit
151f0 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
15200 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
15210 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63   0)).  ){.    rc
15220 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  2 = pagerUnlockD
15230 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
15240 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
15250 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
15260 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  one = 0;.  }.  p
15270 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
15280 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
15290 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
152a0 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  r = 0;..  return
152b0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
152c0 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
152d0 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c  * Execute a roll
152e0 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61  back if a transa
152f0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
15300 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
15310 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
15320 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
15330 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
15340 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
15350 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ROR state, do no
15360 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68  t attempt .** th
15370 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68  e rollback at th
15380 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64  is time. Instead
15390 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  , pager_unlock()
153a0 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a   is called. The.
153b0 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
153c0 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64  _unlock() will d
153d0 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
153e0 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f  mory pages, unlo
153f0 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ck.** the databa
15400 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65  se file and move
15410 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
15420 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49  to OPEN state. I
15430 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73  f this .** means
15440 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
15450 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66   hot-journal lef
15460 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
15470 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a  stem, the next .
15480 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  ** connection to
15490 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
154a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
154b0 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
154c0 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77   this one) .** w
154d0 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  ill roll it back
154e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
154f0 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72  ager has not alr
15500 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
15510 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75   ERROR state, bu
15520 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61  t an IO or.** ma
15530 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
15540 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  s during a rollb
15550 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77  ack, then this w
15560 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65  ill itself cause
15570 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74   .** the pager t
15580 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
15590 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77  R state. Which w
155a0 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62  ill be cleared b
155b0 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  y the.** call to
155c0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c   pager_unlock(),
155d0 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
155e0 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ove..*/.static v
155f0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
15600 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
15610 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15620 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
15630 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
15640 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
15650 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
15660 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
15670 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
15680 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ger) );.    if( 
15690 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
156a0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
156b0 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  KED ){.      sql
156c0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
156d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73  alloc();.      s
156e0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
156f0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
15700 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
15710 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15720 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
15730 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
15740 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
15750 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15760 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
15770 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
15780 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
15790 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Pager, 0, 0);.  
157a0 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f    }.  }.  pager_
157b0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
157c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
157d0 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
157e0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
157f0 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
15800 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
15810 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
15820 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
15830 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
15840 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
15850 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
15860 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
15870 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
15880 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
15890 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
158a0 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
158b0 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
158c0 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
158d0 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
158e0 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
158f0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
15900 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
15910 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
15920 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
15930 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
15940 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
15950 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
15960 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
15970 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
15980 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
15990 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
159a0 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
159b0 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
159c0 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
159d0 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
159e0 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
159f0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
15a00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
15a10 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
15a20 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
15a30 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
15a40 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
15a50 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
15a60 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
15a70 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
15a80 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
15a90 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
15aa0 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
15ab0 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
15ac0 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
15ad0 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
15ae0 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
15af0 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
15b00 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
15b10 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
15b20 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
15b30 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
15b40 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
15b50 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
15b60 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
15b70 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
15b80 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
15b90 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
15ba0 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
15bb0 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
15bc0 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
15bd0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
15be0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
15bf0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
15c00 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
15c10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
15c20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15c30 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
15c40 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
15c50 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
15c60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
15c70 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
15c80 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
15c90 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
15ca0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
15cb0 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
15cc0 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
15cd0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15ce0 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
15cf0 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
15d00 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
15d10 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
15d20 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
15d30 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
15d40 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
15d50 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
15d60 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15d70 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15d90 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
15da0 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
15db0 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
15dc0 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
15dd0 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
15de0 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
15df0 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
15e00 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
15e10 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
15e20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15e30 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
15e40 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20 73  ed bits is the s
15e50 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74 69  ame in the desti
15e60 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20  nation.** pager 
15e70 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65 20  as it is in the 
15e80 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63 6f  source.  This co
15e90 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56 41  mes up when a VA
15ea0 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68 65  CUUM changes the
15eb0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  .** number of re
15ec0 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20 74  served bits to t
15ed0 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f  he "optimal" amo
15ee0 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
15ef0 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52 65  ite3PagerAlignRe
15f00 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44 65  serve(Pager *pDe
15f10 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63 29  st, Pager *pSrc)
15f20 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  {.  if( pDest->n
15f30 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e  Reserve!=pSrc->n
15f40 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20 70  Reserve ){.    p
15f50 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d  Dest->nReserve =
15f60 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b   pSrc->nReserve;
15f70 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
15f80 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20 7d  Size(pDest);.  }
15f90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15fa0 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
15fb0 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
15fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15fd0 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
15fe0 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
15ff0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
16000 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
16010 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
16020 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
16030 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
16040 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
16050 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
16060 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
16070 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
16080 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
16090 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
160a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
160b0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
160c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
160d0 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
160e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
160f0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
16100 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
16110 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
16120 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
16130 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
16140 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
16150 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
16160 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
16170 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
16180 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
16190 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
161a0 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
161b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
161c0 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
161d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
161e0 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
161f0 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
16200 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
16210 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
16220 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
16230 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
16240 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
16250 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
16260 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
16270 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
16280 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
16290 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
162a0 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
162b0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
162c0 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
162d0 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
162e0 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
162f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
16300 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
16310 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
16320 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16330 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
16340 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
16350 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
16360 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
16370 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
16380 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
16390 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
163a0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
163b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
163c0 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
163d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
163e0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
163f0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
16400 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
16410 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
16420 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
16430 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16440 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
16450 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
16460 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
16470 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
16480 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
16490 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
164a0 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
164b0 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
164c0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
164d0 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
164e0 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
164f0 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
16500 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16510 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
16520 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
16530 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
16540 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
16550 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
16560 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
16570 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
16580 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
16590 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
165a0 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
165b0 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
165c0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
165d0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
165e0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
165f0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
16600 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
16610 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
16620 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
16630 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
16640 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
16650 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
16660 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
16670 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
16680 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16690 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
166a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
166b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
166c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
166d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
166e0 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
166f0 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
16700 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
16710 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
16720 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
16730 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
16740 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
16750 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
16760 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
16770 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
16780 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
16790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
167a0 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
167b0 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
167c0 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
167d0 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
167e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
167f0 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
16800 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
16810 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
16820 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
16830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16840 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
16850 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
16860 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
16890 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
168a0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
168b0 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
168c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
168d0 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
168e0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
168f0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
16900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16910 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
16920 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
16930 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
16940 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
16950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
16960 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
16970 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
16980 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
16990 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
169a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
169b0 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
169c0 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 63 6f  s synced */.  co
169d0 6e 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20  nst int jrnlEnc 
169e0 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  = (isMainJrnl ||
169f0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
16a00 65 6d 6f 72 79 3d 3d 30 29 3b 0a 0a 20 20 61 73  emory==0);..  as
16a10 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
16a20 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
16a30 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
16a40 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
16a50 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
16a60 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
16a70 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
16a80 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
16a90 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
16aa0 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
16ab0 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
16ac0 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
16ad0 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
16ae0 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
16af0 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
16b00 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
16b10 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
16b20 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
16b30 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
16b40 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
16b50 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
16b60 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
16b70 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
16b80 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
16b90 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
16ba0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
16bb0 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
16bc0 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
16bd0 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
16be0 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
16bf0 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
16c00 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
16c10 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
16c20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
16c30 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
16c40 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
16c50 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
16c60 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
16c70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16c80 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
16c90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16ca0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
16cb0 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
16cc0 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
16cd0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
16ce0 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
16cf0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
16d00 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
16d10 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
16d20 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
16d30 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
16d40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16d50 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16d60 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
16d70 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
16d80 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
16d90 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
16da0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
16db0 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
16dc0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16dd0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
16de0 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
16df0 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
16e00 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
16e10 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
16e20 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
16e30 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
16e40 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
16e50 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
16e60 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
16e70 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
16e80 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
16e90 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
16ea0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
16eb0 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
16ec0 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
16ed0 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
16ee0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
16ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
16f00 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
16f10 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
16f20 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
16f30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
16f40 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
16f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16f60 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16f70 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
16f80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
16f90 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
16fa0 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
16fb0 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
16fc0 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
16fd0 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
16fe0 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
16ff0 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
17000 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
17010 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
17020 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
17030 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
17040 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
17050 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
17060 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
17070 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
17080 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
17090 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
170a0 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
170b0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
170c0 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
170d0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
170e0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
170f0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
17100 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
17110 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
17120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
17130 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
17140 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
17150 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
17160 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
17170 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
17180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17190 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
171a0 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
171b0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
171c0 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
171d0 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
171e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
171f0 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
17200 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
17210 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
17220 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
17230 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17240 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
17250 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
17260 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
17270 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
17280 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64  ed back before d
17290 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
172a0 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c  t.  ** rollback,
172b0 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68   then don't both
172c0 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  er to play it ba
172d0 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  ck again..  */. 
172e0 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72   if( pDone && (r
172f0 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
17300 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  cSet(pDone, pgno
17310 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
17320 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17330 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70    }..  /* When p
17340 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65  laying back page
17350 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20   1, restore the 
17360 6e 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67  nReserve setting
17370 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
17380 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  ==1 && pPager->n
17390 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61  Reserve!=((u8*)a
173a0 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20  Data)[20] ){.   
173b0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
173c0 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29  e = ((u8*)aData)
173d0 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52  [20];.    pagerR
173e0 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
173f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
17400 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17410 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20  CACHEMOD state, 
17420 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
17430 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
17440 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
17450 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
17460 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
17470 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
17480 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
17490 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
174a0 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
174b0 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
174c0 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
174d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
174e0 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
174f0 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
17500 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
17510 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
17520 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
17530 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
17540 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
17550 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
17560 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
17570 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
17580 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
17590 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
175a0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
175b0 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
175c0 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
175d0 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
175e0 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
175f0 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
17600 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
17610 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
17620 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
17630 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
17640 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
17650 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49  *.  ** If in WRI
17660 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45  TER_DBMOD, WRITE
17670 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50  R_FINISHED or OP
17680 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  EN state, then w
17690 65 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a  e update the.  *
176a0 2a 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  * pager cache if
176b0 20 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74   it exists and t
176c0 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
176d0 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
176e0 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20  arked .  ** not 
176f0 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69  dirty. Since thi
17700 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65  s code is only e
17710 78 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52  xecuted in PAGER
17720 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a  _OPEN state for.
17730 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
17740 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20  al rollback, it 
17750 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
17760 61 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  at the page-cach
17770 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20  e is empty.  ** 
17780 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
17790 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  in OPEN state.. 
177a0 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
177b0 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
177c0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
177d0 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
177e0 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
177f0 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
17800 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
17810 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
17820 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17830 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
17840 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
17850 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
17860 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
17870 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
17880 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
17890 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
178a0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
178b0 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
178c0 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
178d0 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
178e0 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
178f0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
17900 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
17910 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
17920 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
17930 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17940 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
17950 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
17960 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
17970 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
17980 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
17990 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
179a0 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
179b0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
179c0 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
179d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
179e0 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
179f0 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
17a00 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
17a10 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
17a20 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
17a30 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
17a40 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
17a50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17a60 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
17a70 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
17a80 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
17a90 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
17aa0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
17ab0 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
17ac0 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
17ad0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17ae0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
17af0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
17b00 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
17b10 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
17b20 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
17b30 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a  ync==0..  **.  *
17b40 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57  * 2008-04-14:  W
17b50 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
17b60 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75  o vacuum a corru
17b70 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
17b80 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  , it.  ** is pos
17b90 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20  sible to fail a 
17ba0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64  statement on a d
17bb0 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65  atabase that doe
17bc0 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
17bd0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  .  ** Do not att
17be0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66  empt to write if
17bf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
17c00 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70  as never been op
17c10 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ened..  */.  if(
17c20 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
17c30 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20  ger) ){.    pPg 
17c40 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
17c50 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
17c60 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
17c70 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
17c80 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
17c90 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
17ca0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
17cb0 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e!=PAGER_OPEN ||
17cc0 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65   pPg==0 || pPage
17cd0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
17ce0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
17cf0 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
17d00 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
17d10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50  n",.           P
17d20 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
17d30 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
17d40 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
17d50 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74  eSize, (u8*)aDat
17d60 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  a),.           (
17d70 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
17d80 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
17d90 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
17da0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
17db0 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  ){.    isSynced 
17dc0 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
17dd0 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d   || (*pOffset <=
17de0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17df0 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hdr);.  }else{. 
17e00 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70     isSynced = (p
17e10 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67  Pg==0 || 0==(pPg
17e20 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
17e30 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d  NEED_SYNC));.  }
17e40 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
17e50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20  ager->fd).   && 
17e60 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
17e70 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
17e80 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
17e90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
17ea0 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65  N).   && isSynce
17eb0 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f  d.  ){.    i64 o
17ec0 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  fst = (pgno-1)*(
17ed0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
17ee0 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61  Size;.    testca
17ef0 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  se( !isSavepnt &
17f00 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67  & pPg!=0 && (pPg
17f10 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
17f20 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20  ED_SYNC)!=0 );. 
17f30 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
17f40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
17f50 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  );..    /* Write
17f60 20 74 68 65 20 64 61 74 61 20 72 65 61 64 20 66   the data read f
17f70 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
17f80 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
17f90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
17fa0 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 75 61   ** This is usua
17fb0 6c 6c 79 20 73 61 66 65 20 65 76 65 6e 20 66 6f  lly safe even fo
17fc0 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64  r an encrypted d
17fd0 61 74 61 62 61 73 65 20 2d 20 61 73 20 74 68 65  atabase - as the
17fe0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 77 61 73   data.    ** was
17ff0 20 65 6e 63 72 79 70 74 65 64 20 62 65 66 6f 72   encrypted befor
18000 65 20 69 74 20 77 61 73 20 77 72 69 74 74 65 6e  e it was written
18010 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
18020 66 69 6c 65 2e 20 54 68 65 20 65 78 63 65 70 74  file. The except
18030 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 69 66  ion.    ** is if
18040 20 74 68 65 20 64 61 74 61 20 77 61 73 20 6a 75   the data was ju
18050 73 74 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20  st read from an 
18060 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
18070 75 72 6e 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20  urnal. In that. 
18080 20 20 20 2a 2a 20 63 61 73 65 20 69 74 20 6d 75     ** case it mu
18090 73 74 20 62 65 20 65 6e 63 72 79 70 74 65 64 20  st be encrypted 
180a0 68 65 72 65 20 62 65 66 6f 72 65 20 69 74 20 69  here before it i
180b0 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
180c0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
180d0 2a 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  * file.  */.    
180e0 69 66 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 43  if( !jrnlEnc ){C
180f0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44  ODEC2(pPager, aD
18100 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63  ata, pgno, 7, rc
18110 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
18120 50 54 2c 20 61 44 61 74 61 29 3b 7d 0a 20 20 20  PT, aData);}.   
18130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
18140 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
18150 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
18160 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18170 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 21  ofst);.    if( !
18180 6a 72 6e 6c 45 6e 63 20 29 7b 43 4f 44 45 43 31  jrnlEnc ){CODEC1
18190 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
181a0 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
181b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 7d  TE_NOMEM_BKPT);}
181c0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ..    if( pgno>p
181d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
181e0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
181f0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
18200 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
18210 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
18220 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28  kup ){.      if(
18230 20 6a 72 6e 6c 45 6e 63 20 29 7b 43 4f 44 45 43   jrnlEnc ){CODEC
18240 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  1(pPager, aData,
18250 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c   pgno, 3, rc=SQL
18260 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
18270 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
18280 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
18290 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
182a0 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
182b0 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e        if( jrnlEn
182c0 63 20 29 7b 43 4f 44 45 43 32 28 70 50 61 67 65  c ){CODEC2(pPage
182d0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
182e0 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
182f0 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 7d  EM_BKPT,aData);}
18300 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
18310 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
18320 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
18330 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
18340 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
18350 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
18360 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
18370 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
18380 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
18390 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
183a0 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
183b0 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
183c0 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
183d0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
183e0 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
183f0 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
18400 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
18410 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
18420 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
18430 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
18440 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
18450 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
18460 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
18470 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
18480 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
18490 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
184a0 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
184b0 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
184c0 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
184d0 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
184e0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
184f0 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
18500 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
18510 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
18520 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
18530 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
18540 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
18550 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
18560 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
18570 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
18580 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
18590 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
185a0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
185b0 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
185c0 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
185d0 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
185e0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
185f0 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
18600 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
18610 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
18620 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
18630 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
18640 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
18650 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
18660 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
18670 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
18680 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
18690 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
186a0 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
186b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
186c0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
186d0 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  & SPILLFLAG_ROLL
186e0 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  BACK)==0 );.    
186f0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18700 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
18710 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63  ROLLBACK;.    rc
18720 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
18730 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
18740 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
18750 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
18760 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
18770 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
18780 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
18790 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
187a0 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   ~SPILLFLAG_ROLL
187b0 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63  BACK;.    if( rc
187c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
187d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c  turn rc;.    sql
187e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
187f0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
18800 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
18810 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
18820 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
18830 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
18840 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
18850 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
18860 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
18870 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
18880 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
18890 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
188a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
188b0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
188c0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
188d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
188e0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
188f0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
18900 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18910 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18920 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18930 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18940 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18950 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18960 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18970 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18980 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18990 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
189a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
189b0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
189c0 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73  g);.    /* It us
189d0 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71  ed to be that sq
189e0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
189f0 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61  lean(pPg) was ca
18a00 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a  lled here.  But.
18a10 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c      ** that call
18a20 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61   was dangerous a
18a30 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74  nd had no detect
18a40 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e  able benefit sin
18a50 63 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20  ce the cache.   
18a60 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20   ** is normally 
18a70 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74  cleaned by sqlit
18a80 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
18a90 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  () after rollbac
18aa0 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20  k and so.    ** 
18ab0 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
18ac0 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73  . */.    pager_s
18ad0 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
18ae0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
18af0 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
18b00 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
18b10 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
18b20 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
18b30 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
18b40 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
18b50 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
18b60 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
18b70 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
18b80 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
18b90 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
18ba0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
18bb0 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
18bc0 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
18bd0 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
18be0 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 69 66  m disk */.    if
18bf0 28 20 6a 72 6e 6c 45 6e 63 20 29 20 43 4f 44 45  ( jrnlEnc ) CODE
18c00 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
18c10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
18c20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rc=SQLITE_NOMEM_
18c30 42 4b 50 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  BKPT);.    sqlit
18c40 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
18c50 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
18c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18c70 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
18c80 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
18c90 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18ca0 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
18cb0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
18cc0 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
18cd0 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
18ce0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
18cf0 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
18d00 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
18d10 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
18d20 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
18d30 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
18d40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
18d50 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
18d60 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
18d70 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
18d80 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
18d90 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
18da0 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
18db0 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
18dc0 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
18dd0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
18de0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
18df0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18e00 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
18e10 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
18e20 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
18e30 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
18e40 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
18e50 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
18e60 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
18e70 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
18e80 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
18e90 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
18ea0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
18eb0 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
18ec0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
18ed0 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
18ee0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
18ef0 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
18f00 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
18f10 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
18f20 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
18f30 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
18f40 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
18f50 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
18f60 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
18f70 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
18f80 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
18f90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18fa0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
18fb0 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
18fc0 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
18fd0 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
18fe0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
18ff0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19000 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
19010 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
19020 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
19030 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
19040 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
19050 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
19060 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
19070 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
19080 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
19090 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
190a0 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
190b0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
190c0 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
190d0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
190e0 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
190f0 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
19100 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
19110 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
19120 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
19130 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
19140 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
19150 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
19160 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
19170 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
19180 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
19190 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
191a0 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
191b0 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
191c0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
191d0 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
191e0 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
191f0 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
19200 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
19210 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
19220 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
19230 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
19240 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
19250 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
19260 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
19270 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
19280 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
19290 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
192a0 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
192b0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
192c0 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
192d0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
192e0 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
192f0 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
19300 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
19310 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
19320 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
19330 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
19340 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
19350 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
19360 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
19370 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
19380 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
19390 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
193a0 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
193b0 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
193c0 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
193d0 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
193e0 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
193f0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
19400 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
19410 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
19420 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
19430 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
19440 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
19450 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
19460 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
19470 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
19480 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
19490 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
194a0 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
194b0 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
194c0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
194d0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
194e0 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
194f0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
19500 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
19510 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
19520 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
19530 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
19540 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
19550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19560 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
19570 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
19580 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
19590 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
195a0 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
195b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
195c0 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72  nter to one jour
195d0 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69  nal within MJ fi
195e0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  le */.  char *zM
195f0 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
19600 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
19610 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66  ld MJ filename f
19620 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  rom a journal fi
19630 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  le */.  int nMas
19640 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
19650 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73    /* Amount of s
19660 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74  pace allocated t
19670 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a  o zMasterPtr[] *
19680 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
19690 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
196a0 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
196b0 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
196c0 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
196d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
196e0 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
196f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
19700 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
19710 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
19720 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
19730 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
19740 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
19750 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
19760 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
19770 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
19780 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
19790 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
197a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
197b0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
197c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
197d0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
197e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
197f0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
19800 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
19810 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19820 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
19830 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
19840 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
19850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19860 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
19870 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
19880 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
19890 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
198a0 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
198b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
198c0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
198d0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
198e0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
198f0 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
19900 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
19910 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
19920 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
19930 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
19940 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
19950 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
19960 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
19970 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
19980 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
19990 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
199a0 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
199b0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
199c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
199d0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
199e0 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
199f0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
19a00 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
19a10 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
19a20 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  e3Malloc(nMaster
19a30 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
19a40 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28  rPtr + 1);.  if(
19a50 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
19a60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
19a70 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
19a80 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19a90 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
19aa0 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
19ab0 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
19ac0 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
19ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
19ae0 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
19af0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
19b00 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
19b10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
19b20 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
19b30 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19b40 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
19b50 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
19b60 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
19b70 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
19b80 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
19b90 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
19ba0 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
19bb0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
19bc0 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
19bd0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
19be0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
19bf0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
19c00 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
19c10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19c30 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19c40 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
19c50 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
19c60 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
19c70 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
19c80 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
19c90 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
19ca0 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
19cb0 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
19cc0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
19cd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
19ce0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
19cf0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
19d00 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
19d10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19d20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
19d30 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
19d40 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
19d50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
19d60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
19d70 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
19d80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
19d90 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
19da0 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
19db0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
19dc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
19de0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19df0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
19e00 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
19e10 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
19e20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
19e30 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
19e40 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
19e50 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
19e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19e70 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
19e80 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19e90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
19ea0 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
19eb0 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
19ec0 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
19ed0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
19ee0 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
19ef0 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
19f00 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
19f10 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19f20 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
19f30 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19f40 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19f50 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
19f60 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
19f70 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
19f80 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
19f90 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
19fa0 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
19fb0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
19fc0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
19fd0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
19fe0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19ff0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
1a000 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
1a010 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
1a020 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
1a030 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
1a040 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
1a050 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a060 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
1a070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1a080 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a090 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
1a0a0 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
1a0b0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1a0c0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
1a0d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1a0e0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
1a0f0 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
1a100 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
1a110 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
1a120 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
1a130 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
1a140 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1a150 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
1a160 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
1a170 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1a180 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
1a190 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
1a1a0 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
1a1b0 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
1a1c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a1d0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
1a1e0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
1a1f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1a200 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
1a210 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
1a220 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1a230 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
1a240 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1a250 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
1a260 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
1a270 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
1a280 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
1a290 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
1a2a0 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
1a2b0 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62  * Or, it might b
1a2c0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
1a2d0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1a2e0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1a2f0 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
1a300 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
1a310 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
1a320 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
1a330 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
1a340 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
1a350 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
1a360 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
1a370 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
1a380 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
1a390 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
1a3a0 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
1a3b0 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
1a3c0 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
1a3d0 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
1a3e0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
1a3f0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1a400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1a410 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1a420 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
1a430 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
1a440 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
1a450 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
1a460 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
1a470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a480 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
1a490 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1a4a0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
1a4b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a4c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a4d0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1a4e0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
1a4f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1a500 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te!=PAGER_READER
1a510 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f   );.  .  if( isO
1a520 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1a530 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1a540 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1a550 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1a560 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1a570 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a  GER_OPEN) .  ){.
1a580 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
1a590 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
1a5a0 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70    int szPage = p
1a5b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1a5c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a5d0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
1a5e0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
1a5f0 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
1a600 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
1a610 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
1a620 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
1a630 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1a640 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
1a650 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
1a660 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67   newSize = szPag
1a670 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
1a680 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a690 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
1a6a0 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
1a6b0 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
1a6c0 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
1a6d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a6e0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
1a6f0 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
1a700 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
1a710 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a   if( (currentSiz
1a720 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69  e+szPage)<=newSi
1a730 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ze ){.        ch
1a740 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65  ar *pTmp = pPage
1a750 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1a760 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d        memset(pTm
1a770 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20  p, 0, szPage);. 
1a780 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a790 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1a7a0 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65  ) == currentSize
1a7b0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1a7c0 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
1a7d0 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e  zPage) >  curren
1a7e0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
1a7f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1a800 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1a810 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e   pTmp, szPage, n
1a820 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a  ewSize-szPage);.
1a830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a850 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1a860 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1a870 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
1a880 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a890 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1a8a0 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65  eturn a sanitize
1a8b0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
1a8c0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20   sector-size of 
1a8d0 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54  OS file pFile. T
1a8e0 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
1a8f0 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ue is guaranteed
1a900 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20   to lie between 
1a910 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f  32 and MAX_SECTO
1a920 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73  R_SIZE..*/.int s
1a930 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a940 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1a950 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  File){.  int iRe
1a960 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  t = sqlite3OsSec
1a970 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a  torSize(pFile);.
1a980 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b    if( iRet<32 ){
1a990 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b  .    iRet = 512;
1a9a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65  .  }else if( iRe
1a9b0 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  t>MAX_SECTOR_SIZ
1a9c0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
1a9d0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a9e0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65  >=512 );.    iRe
1a9f0 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  t = MAX_SECTOR_S
1aa00 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
1aa10 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iRet;.}../*.**
1aa20 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
1aa30 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
1aa40 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1aa50 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
1aa60 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
1aa70 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1aa80 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1aa90 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
1aaa0 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
1aab0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
1aac0 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1aad0 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  be used .** to d
1aae0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1aaf0 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
1ab00 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
1ab10 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
1ab20 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1ab30 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
1ab40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
1ab50 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
1ab60 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
1ab70 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1ab80 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
1ab90 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
1aba0 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
1abb0 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
1abc0 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
1abd0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
1abe0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
1abf0 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
1ac00 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
1ac10 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
1ac20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
1ac30 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
1ac40 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
1ac50 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1ac60 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
1ac70 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
1ac80 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20  TOR_SIZE..**.** 
1ac90 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  If the file has 
1aca0 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
1acb0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1acc0 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74  RITE property, t
1acd0 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65  hen set.** the e
1ace0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1acf0 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  size to its mini
1ad00 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e  mum value (512).
1ad10 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
1ad20 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74  .** pPager->sect
1ad30 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66  orSize is to def
1ad40 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72  ine the "blast r
1ad50 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20  adius" of bytes 
1ad60 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1ad70 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20  ange if a crash 
1ad80 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
1ad90 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ting to a single
1ada0 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74   byte in.** that
1adb0 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74   range.  But wit
1adc0 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  h POWERSAFE_OVER
1add0 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74  WRITE, the blast
1ade0 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a   radius is zero.
1adf0 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74  ** (that is what
1ae00 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1ae10 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20  RITE means), so 
1ae20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  we minimize the 
1ae30 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20  sector.** size. 
1ae40 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
1ae50 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20  ompatibility of 
1ae60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1ae70 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1ae80 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72  ,.** we cannot r
1ae90 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1aea0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1aeb0 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74  below 512..*/.st
1aec0 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
1aed0 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
1aee0 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
1aef0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1af00 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1af10 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
1af20 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
1af30 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  ile.   || (sqlit
1af40 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1af50 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1af60 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20  ->fd) & .       
1af70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1af80 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1af90 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b  ERWRITE)!=0.  ){
1afa0 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
1afb0 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
1afc0 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
1afd0 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
1afe0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
1aff0 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
1b000 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
1b010 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
1b020 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1b030 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
1b040 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70  gfault. */.    p
1b050 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1b060 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  e = 512;.  }else
1b070 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
1b080 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
1b090 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  e3SectorSize(pPa
1b0a0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a  ger->fd);.  }.}.
1b0b0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1b0c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1b0d0 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
1b0e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1b0f0 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
1b100 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
1b110 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
1b120 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
1b130 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1b140 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
1b150 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
1b160 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
1b170 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
1b180 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
1b190 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
1b1a0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1b1b0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b1c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
1b1d0 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
1b1e0 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
1b1f0 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
1b200 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1b210 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
1b220 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1b230 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
1b240 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
1b250 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
1b260 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
1b270 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1b280 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
1b290 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
1b2a0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
1b2b0 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
1b2c0 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
1b2d0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b2e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b2f0 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
1b300 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
1b310 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
1b320 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
1b330 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
1b340 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1b350 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
1b360 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
1b370 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
1b380 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1b390 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
1b3a0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1b3b0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1b3c0 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73  ch is the page s
1b3d0 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65  ize..**  (7)  ze
1b3e0 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74  ro padding out t
1b3f0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
1b400 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20  r size..**  (8) 
1b410 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
1b420 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
1b430 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
1b440 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1b450 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
1b460 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
1b470 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1b480 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
1b490 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1b4a0 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
1b4b0 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
1b4c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1b4d0 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
1b4e0 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20  e first 7 items 
1b4f0 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
1b500 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
1b510 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
1b520 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74  ce of the 8th it
1b530 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
1b540 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
1b550 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
1b560 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
1b570 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
1b580 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
1b590 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
1b5a0 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
1b5b0 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
1b5c0 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
1b5d0 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
1b5e0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1b5f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
1b600 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
1b610 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
1b620 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
1b630 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
1b640 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
1b650 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
1b660 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
1b670 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b680 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
1b690 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
1b6a0 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
1b6b0 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
1b6c0 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
1b6d0 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
1b6e0 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
1b6f0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
1b700 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
1b710 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
1b720 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
1b730 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
1b740 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
1b750 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1b760 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1b770 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
1b780 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1b790 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
1b7a0 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
1b7b0 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
1b7c0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1b7d0 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
1b7e0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
1b7f0 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
1b800 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
1b810 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
1b820 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
1b830 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
1b840 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
1b850 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
1b860 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
1b870 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
1b880 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
1b890 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
1b8a0 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
1b8b0 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
1b8c0 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
1b8d0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
1b8e0 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
1b8f0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
1b900 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
1b910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1b920 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
1b930 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
1b940 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
1b950 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
1b960 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
1b970 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b980 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
1b990 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
1b9a0 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
1b9b0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1b9c0 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
1b9d0 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
1b9e0 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
1b9f0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
1ba00 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
1ba10 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
1ba20 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
1ba30 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
1ba40 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
1ba50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ba60 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
1ba70 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
1ba80 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
1ba90 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
1baa0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
1bab0 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
1bac0 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
1bad0 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
1bae0 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
1baf0 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
1bb00 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
1bb10 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
1bb20 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
1bb30 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
1bb40 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1bb50 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
1bb60 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
1bb70 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
1bb80 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
1bb90 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
1bba0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
1bbb0 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
1bbc0 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
1bbd0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
1bbe0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
1bbf0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1bc00 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
1bc10 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1bc20 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1bc30 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc50 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
1bc60 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
1bc70 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
1bc80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1bc90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1bca0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
1bcb0 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
1bcc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bcd0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1bce0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1bcf0 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
1bd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1bd10 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
1bd20 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
1bd30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd50 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
1bd60 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
1bd70 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1bd90 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1bda0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1bdb0 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
1bdc0 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
1bdd0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
1bde0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1bdf0 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
1be00 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
1be10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1be20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
1be30 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
1be40 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
1be50 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20   nPlayback = 0; 
1be60 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1be70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72  umber of pages r
1be80 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75  estored from jou
1be90 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  rnal */..  /* Fi
1bea0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1beb0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1bec0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1bed0 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1bee0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1bef0 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1bf00 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1bf10 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1bf20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1bf30 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1bf40 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1bf50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bf60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1bf70 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1bf80 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1bf90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1bfa0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bfb0 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1bfc0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1bfd0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1bfe0 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1bff0 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1c000 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1c010 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1c020 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1c030 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1c040 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1c050 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1c060 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1c070 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1c080 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1c090 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1c0a0 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1c0b0 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1c0c0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1c0d0 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1c0e0 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1c0f0 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1c100 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1c110 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1c120 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c130 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1c140 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68  x.c,.  ** mxPath
1c150 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1c160 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1c170 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1c180 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1c190 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1c1a0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1c1b0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1c1c0 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1c1d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1c1e0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1c1f0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1c200 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1c210 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c220 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1c230 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1c240 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1c250 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1c260 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1c270 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1c280 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1c290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c2a0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1c2b0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c2c0 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1c2d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1c2e0 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1c2f0 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1c300 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1c310 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1c320 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1c330 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1c340 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1c350 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1c360 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1c370 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1c380 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1c390 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1c3a0 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1c3b0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1c3c0 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1c3d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1c3e0 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1c3f0 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1c400 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1c410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1c420 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1c430 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1c440 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1c450 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1c460 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1c470 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1c480 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1c490 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1c4a0 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1c4b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1c4c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1c4d0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1c4e0 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1c4f0 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1c500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c510 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1c520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1c530 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1c540 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c550 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1c560 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c570 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c580 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1c590 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1c5a0 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1c5b0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1c5c0 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1c5d0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1c5e0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1c5f0 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1c600 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1c610 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1c620 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1c630 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1c640 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1c650 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1c660 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1c670 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1c680 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1c690 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1c6a0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1c6b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1c6c0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1c6d0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1c6e0 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1c6f0 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1c700 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1c710 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1c720 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1c730 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1c740 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1c750 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1c760 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1c770 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1c780 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1c790 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1c7a0 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1c7b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1c7c0 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1c7d0 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1c7e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c7f0 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1c800 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1c810 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1c820 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1c830 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1c840 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1c850 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1c860 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1c870 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1c880 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1c890 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1c8a0 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1c8b0 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1c8c0 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1c8d0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1c8e0 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1c8f0 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1c900 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1c910 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1c920 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1c930 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1c940 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1c950 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1c960 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1c970 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1c980 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1c990 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1c9a0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1c9b0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1c9c0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1c9d0 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1c9e0 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1c9f0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1ca00 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1ca10 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1ca20 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1ca30 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1ca40 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1ca50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1ca60 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1ca70 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1ca80 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1ca90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1caa0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1cab0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1cac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1cad0 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1cae0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1caf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1cb00 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1cb10 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1cb20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1cb30 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1cb40 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1cb50 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1cb60 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1cb70 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1cb80 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1cb90 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1cba0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1cbb0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1cbc0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1cbd0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1cbe0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1cbf0 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1cc00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cc10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cc20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1cc30 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1cc40 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1cc50 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1cc60 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1cc70 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1cc80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1cc90 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1cca0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1ccb0 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1ccc0 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1ccd0 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1cce0 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1ccf0 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1cd00 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1cd10 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1cd20 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1cd30 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1cd40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1cd50 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1cd60 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1cd70 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1cd80 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1cd90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cda0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cdb0 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1cdc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cdd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cde0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1cdf0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1ce00 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1ce10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ce20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1ce30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1ce40 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1ce50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1ce60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1ce70 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1ce80 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1ce90 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1cea0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1ceb0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1cec0 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1ced0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1cee0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1cef0 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1cf00 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1cf10 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1cf20 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1cf30 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1cf40 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1cf50 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1cf60 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1cf70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1cf80 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1cf90 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1cfa0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1cfb0 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1cfc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cfd0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1cfe0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1cff0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d010 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1d020 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1d030 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1d040 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1d050 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1d060 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1d070 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1d080 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1d090 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1d0a0 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1d0b0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1d0c0 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1d0d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1d0e0 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1d0f0 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1d100 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1d110 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1d120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d130 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1d140 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1d150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d160 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1d170 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1d180 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1d190 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
1d1a0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
1d1b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1d1c0 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
1d1d0 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
1d1e0 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
1d1f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1d200 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
1d210 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
1d220 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1d230 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
1d240 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
1d250 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
1d260 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
1d270 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1d280 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
1d290 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66  dified..  */.#if
1d2a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d2b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
1d2c0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1d2d0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
1d2e0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
1d2f0 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1d300 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1d310 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ,0);.  }.#endif.
1d320 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c  .  /* If this pl
1d330 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e  ayback is happen
1d340 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ing automaticall
1d350 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  y as a result of
1d360 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20   an IO or .  ** 
1d370 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61  malloc error tha
1d380 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  t occurred after
1d390 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d3a0 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
1d3b0 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65  but .  ** before
1d3c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d3d0 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
1d3e0 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d  then the change-
1d3f0 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f  counter .  ** mo
1d400 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a  dification may j
1d410 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
1d420 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  verted. If this 
1d430 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75  happens in exclu
1d440 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c  sive .  ** mode,
1d450 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
1d460 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65   transactions pe
1d470 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63  rformed by the c
1d480 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e  onnection will n
1d490 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74  ot.  ** update t
1d4a0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1d4b0 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d  r at all. This m
1d4c0 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65  ay lead to cache
1d4d0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20   inconsistency. 
1d4e0 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72   ** problems for
1d4f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1d500 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
1d510 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f  n the future. So
1d520 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63  , just.  ** in c
1d530 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
1d540 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65  pened, clear the
1d550 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
1d560 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   flag now..  */.
1d570 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1d580 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1d590 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1d5a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d5b0 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
1d5c0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1d5d0 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
1d5e0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1d5f0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1d600 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1d610 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1d620 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +1);.    testcas
1d630 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1d640 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1d650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
1d660 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1d670 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1d680 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1d690 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1d6a0 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1d6b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1d6c0 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ync(pPager, 0);.
1d6d0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1d6e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d6f0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1d700 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1d710 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1d720 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  0', 0);.    test
1d730 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1d740 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1d750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1d760 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1d770 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1d780 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1d790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1d7a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1d7b0 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1d7c0 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1d7d0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1d7e0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1d7f0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1d800 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1d810 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1d820 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1d830 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1d840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1d850 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26  }.  if( isHot &&
1d860 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20   nPlayback ){.  
1d870 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
1d880 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
1d890 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72  VER_ROLLBACK, "r
1d8a0 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65  ecovered %d page
1d8b0 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20  s from %s",.    
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61              nPla
1d8d0 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a  yback, pPager->z
1d8e0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20  Journal);.  }.. 
1d8f0 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1d900 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1d910 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1d920 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1d930 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1d940 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1d950 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1d960 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1d970 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1d980 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1d990 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1d9a0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1d9b0 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1d9c0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1d9d0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1d9e0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1d9f0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1da00 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1da10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1da20 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
1da30 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1da40 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1da50 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1da60 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1da70 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1da80 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1da90 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1daa0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1dab0 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1dac0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1dad0 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1dae0 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1daf0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1db00 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1db10 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1db20 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1db30 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1db40 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1db50 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1db60 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1db70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1db80 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1db90 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c  Page(PgHdr *pPg,
1dba0 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20   u32 iFrame){.  
1dbb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1dbc0 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
1dbd0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
1dbe0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1dbf0 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
1dc00 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
1dc10 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
1dc20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
1dc30 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1dc40 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1dc50 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1dc60 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
1dc70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1dc80 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ; /* Number of b
1dc90 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
1dca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1dcb0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1dcc0 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1dcd0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1dce0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1dcf0 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1dd00 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1dd10 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20  if( iFrame ){.  
1dd20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
1dd30 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1dd40 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
1dd50 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
1dd60 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72  sqlite3WalReadFr
1dd70 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1dd80 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20  , iFrame, pgsz, 
1dd90 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pPg->pData);.  }
1dda0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
1ddb0 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1ddc0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1ddd0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1dde0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1ddf0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1de00 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1de10 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1de20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1de30 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1de40 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1de50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1de60 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1de70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1de80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1de90 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1dea0 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1deb0 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1dec0 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1ded0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1dee0 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1def0 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1df00 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1df10 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1df20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1df30 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1df40 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1df50 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1df60 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1df70 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1df80 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1df90 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1dfa0 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1dfb0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1dfc0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1dfd0 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1dfe0 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1dff0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1e000 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e010 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1e020 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1e030 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1e040 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1e050 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1e060 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1e070 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1e080 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1e090 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1e0a0 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1e0b0 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1e0c0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1e0d0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1e0e0 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e  te noise equalin
1e0f0 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1e100 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1e110 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1e120 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1e130 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1e140 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1e150 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1e160 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1e170 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1e180 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1e190 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1e1a0 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1e1b0 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1e1c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1e1d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e1e0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1e1f0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1e200 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1e210 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1e220 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1e230 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1e240 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1e250 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  KPT);..  PAGER_I
1e260 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1e270 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1e280 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1e290 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1e2a0 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1e2b0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1e2c0 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1e2d0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1e2e0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1e2f0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1e300 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1e310 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1e320 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1e330 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1e340 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1e350 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1e360 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1e370 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1e380 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1e390 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1e3a0 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1e3b0 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1e3c0 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1e3d0 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1e3e0 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1e3f0 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1e400 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1e410 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1e420 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1e430 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1e440 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1e450 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1e460 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1e470 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1e480 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1e490 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1e4a0 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1e4b0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1e4c0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1e4d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1e4e0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1e4f0 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1e500 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1e510 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1e520 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1e530 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1e540 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1e550 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1e560 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1e570 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1e580 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e590 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1e5a0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1e5b0 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1e5c0 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1e5d0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1e5e0 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1e5f0 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1e600 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1e610 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1e620 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1e630 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1e640 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1e650 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1e660 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1e670 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1e680 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1e690 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1e6a0 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1e6b0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1e6c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e6d0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1e6e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e6f0 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1e700 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1e710 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1e720 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1e730 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1e740 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1e750 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1e760 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1e770 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1e780 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1e790 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1e7a0 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1e7b0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1e7c0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1e7d0 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1e7e0 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1e7f0 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1e800 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1e810 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1e820 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1e830 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1e840 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1e850 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1e860 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1e870 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1e880 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1e890 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1e8a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1e8b0 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1e8c0 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1e8d0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1e8e0 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1e8f0 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1e900 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1e910 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1e920 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1e930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e940 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1e950 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1e960 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1e970 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e980 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e990 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1e9a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1e9b0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1e9c0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1e9d0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1e9e0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1e9f0 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1ea00 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1ea10 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1ea20 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1ea30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ea40 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1ea50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ea60 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
1ea70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1ea80 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
1ea90 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1eaa0 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d  Pg->pgno, &iFram
1eab0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1eac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ead0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
1eae0 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
1eaf0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1eb00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1eb10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1eb20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1eb30 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
1eb40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1eb50 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
1eb60 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
1eb70 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69    /* Normally, i
1eb80 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1eb90 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1eba0 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65  any backup proce
1ebb0 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70  sses are.  ** up
1ebc0 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73  dated as data is
1ebd0 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
1ebe0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1ebf0 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65  nal and into the
1ec00 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
1ec10 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65  This is not gene
1ec20 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77  rally possible w
1ec30 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61  ith a WAL databa
1ec40 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c  se, as.  ** roll
1ec50 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69  back involves si
1ec60 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20  mply truncating 
1ec70 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68  the log file. Th
1ec80 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a  erefore, if one.
1ec90 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61    ** or more fra
1eca0 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
1ecb0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ecc0 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68   the log (and th
1ecd0 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c  erefore .  ** al
1ece0 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  so copied into t
1ecf0 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61  he backup databa
1ed00 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20  ses) as part of 
1ed10 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1ed20 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75  ,.  ** the backu
1ed30 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61  ps must be resta
1ed40 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rted..  */.  sql
1ed50 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
1ed60 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
1ed70 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  p);..  return rc
1ed80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ed90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1eda0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ed to rollback a
1edb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1edc0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a  a WAL database..
1edd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ede0 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50  gerRollbackWal(P
1edf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ee00 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1ee30 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1ee40 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1ee50 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1ee60 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72  dirty pages to r
1ee70 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46  evert */..  /* F
1ee80 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  or all pages in 
1ee90 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61  the cache that a
1eea0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  re currently dir
1eeb0 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61  ty or have alrea
1eec0 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69  dy.  ** been wri
1eed0 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f  tten (but not co
1eee0 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20  mmitted) to the 
1eef0 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65  log file, do one
1ef00 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f   of the .  ** fo
1ef10 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20  llowing:.  **.  
1ef20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74  **   + Discard t
1ef30 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28  he cached page (
1ef40 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c  if refcount==0),
1ef50 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c   or.  **   + Rel
1ef60 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
1ef70 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1ef80 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e  se (if refcount>
1ef90 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  0)..  */.  pPage
1efa0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1efb0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1efc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1efd0 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  lUndo(pPager->pW
1efe0 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  al, pagerUndoCal
1eff0 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70  lback, (void *)p
1f000 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20  Pager);.  pList 
1f010 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f020 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f030 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69  >pPCache);.  whi
1f040 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d  le( pList && rc=
1f050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f060 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
1f070 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1f080 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
1f090 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64  doCallback((void
1f0a0 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74   *)pPager, pList
1f0b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69  ->pgno);.    pLi
1f0c0 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a  st = pNext;.  }.
1f0d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f0e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f0f0 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65  tion is a wrappe
1f100 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
1f110 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20  WalFrames(). As 
1f120 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a  well as logging.
1f130 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
1f140 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  of the list of p
1f150 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70  ages headed by p
1f160 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20  List (connected 
1f170 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74  by pDirty),.** t
1f180 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74  his function not
1f190 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65  ifies any active
1f1a0 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1f1b0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73  s that the pages
1f1c0 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64   have.** changed
1f1d0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73  . .**.** The lis
1f1e0 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73 65  t of pages passe
1f1f0 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
1f200 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f  ine is always so
1f210 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d  rted by page num
1f220 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69  ber..** Hence, i
1f230 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72 73  f page 1 appears
1f240 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
1f250 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62   list, it will b
1f260 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1f270 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
1f280 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
1f290 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f2b0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1f2c0 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ct */.  PgHdr *p
1f2d0 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
1f2e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1f2f0 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67  of frames to log
1f300 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e   */.  Pgno nTrun
1f310 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1f320 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f330 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69  e size after thi
1f340 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  s commit */.  in
1f350 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f370 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1f380 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a   a commit */.){.
1f390 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1f3c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b   */.  int nList;
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f3f0 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73  of pages in pLis
1f400 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b  t */.  PgHdr *p;
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1f430 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73  oping over pages
1f440 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1f450 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20  Pager->pWal );. 
1f460 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1f470 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1f480 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
1f490 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
1f4a0 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e  list is in accen
1f4b0 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
1f4c0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26  for(p=pList; p &
1f4d0 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70  & p->pDirty; p=p
1f4e0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61  ->pDirty){.    a
1f4f0 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c  ssert( p->pgno <
1f500 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f   p->pDirty->pgno
1f510 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1f520 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1f530 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73  >pDirty==0 || is
1f540 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20  Commit );.  if( 
1f550 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
1f560 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e  /* If a WAL tran
1f570 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
1f580 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72   committed, ther
1f590 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1f5a0 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
1f5b0 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70  any pages with p
1f5c0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1f5d0 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61  ter than nTrunca
1f5e0 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20  te into the WAL 
1f5f0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  file..    ** The
1f600 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
1f610 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65  read by any clie
1f620 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68  nt. So remove th
1f630 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72  em from the pDir
1f640 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68  ty.    ** list h
1f650 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64  ere. */.    PgHd
1f660 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1f670 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  ist;.    nList =
1f680 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   0;.    for(p=pL
1f690 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1f6a0 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72  p)!=0; p=p->pDir
1f6b0 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ty){.      if( p
1f6c0 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74  ->pgno<=nTruncat
1f6d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e  e ){.        ppN
1f6e0 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1f6f0 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b  ;.        nList+
1f700 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1f710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1f720 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1f730 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
1f740 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
1f750 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
1f760 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
1f770 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
1f780 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
1f790 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1f7a0 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
1f7b0 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1f7c0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
1f7d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1f7e0 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
1f7f0 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
1f800 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
1f810 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
1f820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f830 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
1f840 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  kup ){.    for(p
1f850 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1f860 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73  pDirty){.      s
1f870 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1f880 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1f890 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38  up, p->pgno, (u8
1f8a0 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20   *)p->pData);.  
1f8b0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
1f8c0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1f8d0 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  ES.  pList = sql
1f8e0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1f8f0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1f900 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c  che);.  for(p=pL
1f910 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1f920 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  rty){.    pager_
1f930 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b  set_pagehash(p);
1f940 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1f950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f960 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
1f970 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f980 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
1f990 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
1f9a0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
1f9b0 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
1f9c0 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
1f9d0 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
1f9e0 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
1f9f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
1fa00 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
1fa10 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
1fa20 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
1fa30 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
1fa40 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
1fa50 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
1fa60 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
1fa70 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
1fa80 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
1fa90 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
1faa0 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
1fab0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
1fac0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1fad0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1fb00 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
1fb10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1fb20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1fb30 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
1fb40 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
1fb50 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1fb60 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
1fb70 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1fb80 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
1fb90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1fba0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
1fbb0 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61  ..  /* sqlite3Wa
1fbc0 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1fbd0 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ion() was not ca
1fbe0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65  lled for the pre
1fbf0 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73  vious.  ** trans
1fc00 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e  action in lockin
1fc10 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
1fc20 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f  .  So call it no
1fc30 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61  w.  If we.  ** a
1fc40 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  re in locking_mo
1fc50 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e  de=NORMAL and En
1fc60 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76  dRead() was prev
1fc70 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20  iously called,. 
1fc80 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74   ** the duplicat
1fc90 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65  e call is harmle
1fca0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
1fcb0 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1fcc0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1fcd0 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73  pWal);..  rc = s
1fce0 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65  qlite3WalBeginRe
1fcf0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1fd00 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61  ager->pWal, &cha
1fd10 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21  nged);.  if( rc!
1fd20 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68  =SQLITE_OK || ch
1fd30 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67  anged ){.    pag
1fd40 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1fd50 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
1fd60 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
1fd70 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
1fd80 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
1fd90 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1fda0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1fdb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fdc0 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
1fdd0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  rt of the transi
1fde0 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f  tion from PAGER_
1fdf0 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52  OPEN.** to PAGER
1fe00 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f  _READER state to
1fe10 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1fe20 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1fe30 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70  ase file.** in p
1fe40 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74  ages (assuming t
1fe50 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72  he page size cur
1fe60 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1fe70 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29   Pager.pageSize)
1fe80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
1fe90 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
1fea0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1feb0 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  d and the size o
1fec0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1fed0 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74  * in pages is st
1fee0 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e  ored in *pnPage.
1fef0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
1ff00 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61  rror code (perha
1ff10 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  ps.** SQLITE_IOE
1ff20 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74  RR_FSTAT) is ret
1ff30 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
1ff40 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  e is left unmodi
1ff50 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
1ff60 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
1ff70 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1ff80 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b  , Pgno *pnPage){
1ff90 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffb0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1ffc0 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
1ffd0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79  e */..  /* Query
1ffe0 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1fff0 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61  tem for the data
20000 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57  base size. The W
20010 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20  alDbsize().  ** 
20020 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
20030 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c   zero if the WAL
20040 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e   is not open (i.
20050 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30  e. Pager.pWal==0
20060 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68  ), or.  ** if th
20070 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
20080 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
20090 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
200a0 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ize is not.  ** 
200b0 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
200c0 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
200d0 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c  m if the log fil
200e0 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20  e is empty or.  
200f0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76  ** contains no v
20100 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74  alid committed t
20110 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  ransactions..  *
20120 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
20130 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
20140 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65  R_OPEN );.  asse
20150 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
20160 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
20170 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
20180 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
20190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
201a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
201b0 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
201c0 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
201d0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
201e0 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  /* If the number
201f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
20200 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
20210 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
20220 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62  the.  ** WAL sub
20230 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69  -system, determi
20240 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e  ne the page coun
20250 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  te based on the 
20260 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  size of.  ** the
20270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20280 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
20290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
202a0 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a  e is not an.  **
202b0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
202c0 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
202d0 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65  ze, round up the
202e0 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
202f0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20  if( nPage==0 && 
20300 41 4c 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50  ALWAYS(isOpen(pP
20310 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20  ager->fd)) ){.  
20320 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20340 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
20350 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
20360 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
20370 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
20380 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
20390 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
203a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
203b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
203c0 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
203d0 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67  )((n+pPager->pag
203e0 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65  eSize-1) / pPage
203f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
20400 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
20410 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
20420 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
20430 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
20440 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
20450 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
20460 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
20470 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
20480 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
20490 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
204a0 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
204b0 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
204c0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
204d0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
204e0 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
204f0 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
20500 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
20510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
20520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20530 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65  IT_WAL./*.** Che
20540 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
20550 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
20560 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
20570 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
20580 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
20590 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
205a0 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
205b0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
205c0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
205d0 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
205e0 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
205f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20600 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
20610 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
20620 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
20630 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
20640 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
20650 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
20660 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
20670 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
20680 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
20690 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
206a0 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
206b0 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
206c0 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
206d0 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
206e0 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
206f0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
20700 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
20710 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
20720 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
20730 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
20740 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
20750 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20760 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
20770 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
20780 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
20790 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
207a0 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
207b0 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
207c0 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
207d0 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
207e0 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
207f0 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
20800 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
20810 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
20820 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
20830 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
20840 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
20850 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
20860 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
20870 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
20880 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
20890 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
208a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
208b0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
208c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
208d0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
208e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
208f0 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
20900 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
20910 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
20920 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
20950 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
20960 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20990 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
209a0 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
209b0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
209c0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
209d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
209e0 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
209f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
20a00 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
20a10 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
20a20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
20a30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20a40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
20a50 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d  ETE_NOENT ) rc =
20a60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20a70 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
20a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
20a90 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
20aa0 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
20ab0 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
20ac0 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
20ad0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
20ae0 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
20af0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
20b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20b10 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
20b20 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
20b30 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
20b40 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
20b50 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
20b60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
20b70 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
20b80 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
20b90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
20ba0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20bb0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
20bc0 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
20bd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
20be0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
20bf0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
20c00 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
20c10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20c20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
20c30 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
20c40 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
20c50 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
20c60 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
20c70 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
20c80 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
20c90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
20ca0 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
20cb0 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
20cc0 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
20cd0 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
20ce0 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
20cf0 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
20d00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
20d10 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
20d20 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
20d30 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
20d40 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
20d50 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
20d60 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
20d70 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
20d80 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
20d90 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
20da0 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
20db0 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
20dc0 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
20dd0 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
20de0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
20df0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
20e00 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
20e10 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
20e20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
20e30 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
20e40 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20e50 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
20e60 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20e70 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
20e80 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
20e90 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
20ea0 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
20eb0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20ec0 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
20ed0 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
20ee0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20ef0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
20f00 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
20f10 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
20f20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
20f30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
20f40 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
20f50 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
20f60 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20f70 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
20f80 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
20f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
20fa0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
20fb0 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
20fc0 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
20fd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
20fe0 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
20ff0 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
21000 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
21010 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21020 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
21030 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
21040 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
21050 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
21060 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
21070 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
21080 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
21090 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
210a0 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
210b0 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
210c0 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
210d0 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
210e0 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
210f0 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
21100 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
21110 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
21120 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
21130 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
21140 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
21150 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
21160 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
21170 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
21180 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
21190 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
211a0 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
211b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
211c0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
211d0 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
211e0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
211f0 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
21200 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
21210 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
21220 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
21230 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
21240 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
21250 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
21260 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
21270 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
21280 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
21290 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
212a0 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
212b0 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
212c0 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
212d0 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
212e0 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
212f0 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
21300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21310 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
21320 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
21330 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
21340 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
21350 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
21360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
21370 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
21380 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21390 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
213a0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
213b0 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
213c0 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
213d0 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
213e0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
213f0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
21400 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
21410 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
21420 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
21430 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
21440 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
21450 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
21460 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21470 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
21480 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
21490 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
214a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
214b0 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  CKED );..  /* Al
214c0 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
214d0 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
214e0 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
214f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
21500 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
21510 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
21520 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
21530 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
21540 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
21550 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
21560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
21570 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
21580 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
21590 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
215a0 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
215b0 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
215c0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
215d0 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
215e0 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
215f0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
21600 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
21610 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
21620 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
21630 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50  dbOrigSize;.  pP
21640 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
21650 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
21660 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
21670 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20   !pSavepoint && 
21680 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21690 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
216a0 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  n pagerRollbackW
216b0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
216c0 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
216d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
216e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
216f0 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
21700 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
21710 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
21720 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
21730 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
21740 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
21750 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
21760 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
21770 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
21780 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
21790 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
217a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
217b0 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
217c0 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
217d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
217e0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  f;.  assert( pag
217f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21800 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b  ==0 || szJ==0 );
21810 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
21820 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
21830 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
21840 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
21850 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
21860 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
21870 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
21880 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
21890 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
218a0 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
218b0 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
218c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
218d0 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
218e0 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
218f0 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
21900 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
21910 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
21920 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
21930 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
21940 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
21950 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
21960 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
21970 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
21980 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
21990 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26  if( pSavepoint &
219a0 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
219b0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48  Pager) ){.    iH
219c0 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
219d0 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
219e0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
219f0 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
21a00 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21a10 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
21a20 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
21a30 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
21a40 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
21a50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
21a60 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
21a70 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
21a80 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
21a90 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
21aa0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
21ab0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21ac0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21ad0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  E_DONE );.  }els
21ae0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
21af0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
21b00 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75   }..  /* Continu
21b10 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  e rolling back r
21b20 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68  ecords out of th
21b30 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
21b40 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
21b50 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
21b60 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e  l header seen an
21b70 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74  d continuing unt
21b80 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  il the effective
21b90 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65   end.  ** of the
21ba0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
21bb0 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  le.  Continue to
21bc0 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e   skip out-of-ran
21bd0 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a  ge pages and.  *
21be0 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e  * continue addin
21bf0 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  g pages rolled b
21c00 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20  ack to pDone..  
21c10 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
21c20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
21c30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
21c40 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69  szJ ){.    u32 i
21c50 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
21c60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
21c70 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
21c80 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
21c90 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
21ca0 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
21cb0 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
21cc0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
21cd0 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26  Pager, 0, szJ, &
21ce0 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
21cf0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21d00 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
21d10 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
21d20 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
21d30 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
21d40 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
21d50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21d60 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
21d70 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
21d80 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
21d90 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
21da0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
21db0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
21dc0 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
21dd0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
21de0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21df0 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
21e00 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
21e10 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
21e20 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
21e30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21e40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
21e50 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
21e60 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
21e70 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
21e80 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
21e90 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
21ea0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
21eb0 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
21ec0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21ed0 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
21ee0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21ef0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
21f00 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
21f10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
21f20 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
21f30 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
21f40 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21f50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
21f70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21f80 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off>=szJ );..  /
21f90 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
21fa0 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
21fb0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
21fc0 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
21fd0 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
21fe0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
21ff0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
22000 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
22010 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
22020 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
22030 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
22040 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
22050 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
22060 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
22070 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
22080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22090 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
220a0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
220b0 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  64)pSavepoint->i
220c0 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
220d0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
220e0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
220f0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
22100 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
22110 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28  alSavepointUndo(
22120 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53  pPager->pWal, pS
22130 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61  avepoint->aWalDa
22140 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ta);.    }.    f
22150 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
22160 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
22170 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70  QLITE_OK && ii<p
22180 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20  Pager->nSubRec; 
22190 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
221a0 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36  ert( offset==(i6
221b0 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  4)ii*(4+pPager->
221c0 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
221d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
221e0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
221f0 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c  pPager, &offset,
22200 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20   pDone, 0, 1);. 
22210 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22220 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
22230 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
22240 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
22250 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
22260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22270 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
22280 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
22290 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
222a0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
222b0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
222c0 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
222d0 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
222e0 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  lowed.** before 
222f0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65  attempting to re
22300 63 79 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20  cycle clean and 
22310 75 6e 75 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f  unused pages..*/
22320 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22330 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
22340 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22350 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
22360 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
22370 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
22380 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
22390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
223a0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
223b0 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
223c0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
223d0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72  allowed.** befor
223e0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
223f0 73 70 69 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a  spill pages to j
22400 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
22410 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70  qlite3PagerSetSp
22420 69 6c 6c 73 69 7a 65 28 50 61 67 65 72 20 2a 70  illsize(Pager *p
22430 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
22440 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
22450 69 74 65 33 50 63 61 63 68 65 53 65 74 53 70 69  ite3PcacheSetSpi
22460 6c 6c 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  llsize(pPager->p
22470 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
22480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
22490 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
224a0 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e  AP_SIZE based on
224b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
224c0 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f  ue of szMmap..*/
224d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
224e0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
224f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
22500 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
22510 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74  P_SIZE>0.  sqlit
22520 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
22530 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20  ager->fd;.  if( 
22540 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64  isOpen(fd) && fd
22550 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
22560 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73  sion>=3 ){.    s
22570 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
22580 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72  .    sz = pPager
22590 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50  ->szMmap;.    pP
225a0 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
225b0 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65  = (sz>0);.    se
225c0 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50  tGetterMethod(pP
225d0 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
225e0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
225f0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
22600 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
22610 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20  P_SIZE, &sz);.  
22620 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
22630 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
22640 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79  imum size of any
22650 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
22660 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  made of the data
22670 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  base file..*/.vo
22680 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22690 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65  etMmapLimit(Page
226a0 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74  r *pPager, sqlit
226b0 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
226c0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d  {.  pPager->szMm
226d0 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70  ap = szMmap;.  p
226e0 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
226f0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
22700 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d  * Free as much m
22710 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
22720 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
22730 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22740 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67  3PagerShrink(Pag
22750 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
22760 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69  qlite3PcacheShri
22770 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nk(pPager->pPCac
22780 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  he);.}../*.** Ad
22790 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66  just settings of
227a0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 68   the pager to th
227b0 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  ose specified in
227c0 20 74 68 65 20 70 67 46 6c 61 67 73 20 70 61 72   the pgFlags par
227d0 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
227e0 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46  e "level" in pgF
227f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
22800 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65  CHRONOUS_MASK se
22810 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  ts the robustnes
22820 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  s.** of the data
22830 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
22840 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
22850 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
22860 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e  es by.** changin
22870 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
22880 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
22890 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
228a0 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  ls..** There are
228b0 20 66 6f 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a   four levels:.**
228c0 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
228d0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
228e0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
228f0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
22900 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
22910 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
22920 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
22930 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
22940 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
22950 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
22960 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
22970 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
22980 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22990 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
229a0 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
229b0 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
229c0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
229d0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
229e0 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
229f0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
22a00 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
22a10 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
22a20 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
22a30 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
22a40 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
22a50 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
22a60 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
22a70 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
22a80 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
22a90 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
22aa0 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
22ab0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
22ac0 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
22ad0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
22ae0 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
22af0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
22b00 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
22b10 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
22b20 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
22b30 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
22b40 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
22b50 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
22b60 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
22b70 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
22b80 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
22b90 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
22ba0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22bb0 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
22bc0 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
22bd0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
22be0 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
22bf0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
22c00 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
22c10 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
22c20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
22c30 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
22c40 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
22c50 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
22c60 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22c70 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
22c80 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
22c90 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
22ca0 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
22cb0 2a 20 20 20 20 45 58 54 52 41 20 20 20 20 20 54  *    EXTRA     T
22cc0 68 69 73 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c  his is like FULL
22cd0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 73 20   except that is 
22ce0 61 6c 73 6f 20 73 79 6e 63 73 20 74 68 65 20 64  also syncs the d
22cf0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20  irectory.**     
22d00 20 20 20 20 20 20 20 20 20 74 68 61 74 20 63 6f           that co
22d10 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62  ntains the rollb
22d20 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65  ack journal afte
22d30 72 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  r the rollback.*
22d40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  *              j
22d50 6f 75 72 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b  ournal is unlink
22d60 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  ed..**.** The ab
22d70 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c  ove is for a rol
22d80 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  lback-journal mo
22d90 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64  de.  For WAL mod
22da0 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73  e, OFF continues
22db0 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74  .** to mean that
22dc0 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f   no syncs ever o
22dd0 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65  ccur.  NORMAL me
22de0 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
22df0 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72   is synced.** pr
22e00 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
22e10 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   of checkpoint a
22e20 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
22e30 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e  base file is syn
22e40 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  ced.** at the co
22e50 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20  nclusion of the 
22e60 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
22e70 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
22e80 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77   of the WAL.** w
22e90 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  as written back 
22ea0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
22eb0 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20  e.  But no sync 
22ec0 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72  operations occur
22ed0 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e   for.** an ordin
22ee0 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f  ary commit in NO
22ef0 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57  RMAL mode with W
22f00 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20  AL.  FULL means 
22f10 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20  that the WAL.** 
22f20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66  file is synced f
22f30 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f  ollowing each co
22f40 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20  mmit operation, 
22f50 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  in addition to t
22f60 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f  he.** syncs asso
22f70 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d  ciated with NORM
22f80 41 4c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  AL.  There is no
22f90 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
22fa0 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  een FULL.** and 
22fb0 45 58 54 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f  EXTRA for WAL mo
22fc0 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  de..**.** Do not
22fd0 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f   confuse synchro
22fe0 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53  nous=FULL with S
22ff0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e  QLITE_SYNC_FULL.
23000 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
23010 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20  SYNC_FULL macro 
23020 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65  means to use the
23030 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75   MacOSX-style fu
23040 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e  ll-fsync.** usin
23050 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53  g fcntl(F_FULLFS
23060 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59  YNC).  SQLITE_SY
23070 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  NC_NORMAL means 
23080 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69  to do an.** ordi
23090 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c  nary fsync() cal
230a0 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  l.  There is no 
230b0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
230c0 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  en SQLITE_SYNC_F
230d0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  ULL.** and SQLIT
230e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e  E_SYNC_NORMAL on
230f0 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72   platforms other
23100 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42   than MacOSX.  B
23110 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72  ut the.** synchr
23120 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75  onous=FULL versu
23130 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  s synchronous=NO
23140 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74  RMAL setting det
23150 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20  ermines when.** 
23160 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74  the xSync primit
23170 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e  ive is called an
23180 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  d is relevant to
23190 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a   all platforms..
231a0 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
231b0 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
231c0 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
231d0 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
231e0 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
231f0 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
23200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
23210 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
23220 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
23230 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a  Flags(.  Pager *
23240 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
23250 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73  * The pager to s
23260 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  et safety level 
23270 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  for */.  unsigne
23280 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f  d pgFlags      /
23290 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20  * Various flags 
232a0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
232b0 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73   level = pgFlags
232c0 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   & PAGER_SYNCHRO
232d0 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28  NOUS_MASK;.  if(
232e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
232f0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
23300 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  >noSync = 1;.   
23310 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
23320 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
23330 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30  r->extraSync = 0
23340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23350 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
23360 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59   level==PAGER_SY
23370 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31  NCHRONOUS_OFF ?1
23380 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  :0;.    pPager->
23390 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
233a0 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  >=PAGER_SYNCHRON
233b0 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20  OUS_FULL ?1:0;. 
233c0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
233d0 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41  Sync = level==PA
233e0 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
233f0 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a  EXTRA ?1:0;.  }.
23400 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
23410 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
23420 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
23430 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  0;.    pPager->c
23440 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30  kptSyncFlags = 0
23450 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67  ;.  }else if( pg
23460 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55  Flags & PAGER_FU
23470 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70  LLFSYNC ){.    p
23480 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23490 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
234a0 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ULL;.    pPager-
234b0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
234c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
234d0 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  L;.  }else if( p
234e0 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
234f0 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b  KPT_FULLFSYNC ){
23500 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
23510 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23520 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
23530 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
23540 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23550 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
23560 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
23570 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
23580 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
23590 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
235a0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
235b0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
235c0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61    }.  pPager->wa
235d0 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61  lSyncFlags = pPa
235e0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
235f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
23600 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
23610 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
23620 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54  gs |= WAL_SYNC_T
23630 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d  RANSACTIONS;.  }
23640 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  .  if( pgFlags &
23650 20 50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c   PAGER_CACHESPIL
23660 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  L ){.    pPager-
23670 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e  >doNotSpill &= ~
23680 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
23690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
236a0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
236b0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b  = SPILLFLAG_OFF;
236c0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
236d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
236e0 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
236f0 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
23700 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
23710 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
23720 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
23730 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
23740 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
23750 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
23760 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
23770 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
23780 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
23790 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
237a0 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
237b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
237c0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
237d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
237e0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
237f0 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c  iptor into *pFil
23800 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
23810 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a  _OK on success .
23820 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
23830 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
23840 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77  e fail. The OS w
23850 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
23860 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  y .** delete the
23870 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
23880 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
23890 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
238a0 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  gs passed to the
238b0 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e   VFS layer xOpen
238c0 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73  () call are thos
238d0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
238e0 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46  y parameter vfsF
238f0 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74  lags ORed with t
23900 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
23910 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
23920 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a  PEN_READWRITE.**
23930 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23940 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53  _CREATE.**     S
23950 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
23960 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  SIVE.**     SQLI
23970 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
23980 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20  CLOSE.*/.static 
23990 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  int pagerOpentem
239a0 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
239b0 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
239c0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  e pager object *
239d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
239e0 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69   *pFile,  /* Wri
239f0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
23a00 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20  riptor here */. 
23a10 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
23a20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
23a30 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
23a40 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
23a50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
23a60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
23a70 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65  n code */..#ifde
23a80 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
23a90 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
23aa0 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
23ab0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
23ac0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
23ad0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
23ae0 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
23af0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23b00 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
23b10 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
23b20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23b30 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
23b40 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
23b50 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
23b60 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67  lite3OsOpen(pPag
23b70 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69  er->pVfs, 0, pFi
23b80 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
23b90 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
23ba0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
23bb0 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20  pen(pFile) );.  
23bc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23bd0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
23be0 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
23bf0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  n..**.** The pag
23c00 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62  er invokes the b
23c10 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73  usy-handler if s
23c20 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72  qlite3OsLock() r
23c30 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
23c40 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69  E_BUSY when tryi
23c50 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
23c60 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20  om no-lock to a 
23c70 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20  SHARED lock,.** 
23c80 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  or when trying t
23c90 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
23ca0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74   RESERVED lock t
23cb0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  o an EXCLUSIVE .
23cc0 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73  ** lock. It does
23cd0 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68   *not* invoke th
23ce0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77  e busy handler w
23cf0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
23d00 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20  om.** SHARED to 
23d10 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65  RESERVED, or whe
23d20 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
23d30 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55   SHARED to EXCLU
23d40 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f  SIVE.** (which o
23d50 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74  ccurs during hot
23d60 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
23d70 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a  k). Summary:.**.
23d80 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20  **   Transition 
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23da0 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73         | Invokes
23db0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a   xBusyHandler.**
23dc0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
23dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
23e00 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d   NO_LOCK       -
23e10 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  > SHARED_LOCK   
23e20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48     | Yes.**   SH
23e30 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52  ARED_LOCK   -> R
23e40 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20  ESERVED_LOCK    
23e50 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44  | No.**   SHARED
23e60 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55  _LOCK   -> EXCLU
23e70 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f  SIVE_LOCK   | No
23e80 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c  .**   RESERVED_L
23e90 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  OCK -> EXCLUSIVE
23ea0 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a  _LOCK   | Yes.**
23eb0 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d  .** If the busy-
23ec0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
23ed0 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
23ee0 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a  o, the lock is .
23ef0 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69  ** retried. If i
23f00 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  t returns zero, 
23f10 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  then the SQLITE_
23f20 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a  BUSY error is.**
23f30 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
23f40 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70   caller of the p
23f50 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
23f60 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
23f70 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
23f80 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a  ndler(.  Pager *
23f90 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23fb0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
23fc0 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
23fd0 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20  ndler)(void *), 
23fe0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
23ff0 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c  er to busy-handl
24000 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  er function */. 
24010 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
24020 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20  lerArg          
24030 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
24040 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75  t to pass to xBu
24050 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a  syHandler */.){.
24060 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
24070 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
24080 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
24090 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
240a0 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
240b0 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65  rg;..  if( isOpe
240c0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
240d0 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d  .    void **ap =
240e0 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65   (void **)&pPage
240f0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b  r->xBusyHandler;
24100 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69  .    assert( ((i
24110 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61  nt(*)(void *))(a
24120 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e  p[0]))==xBusyHan
24130 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65  dler );.    asse
24140 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79  rt( ap[1]==pBusy
24150 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20  HandlerArg );.  
24160 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
24170 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
24180 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
24190 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c  NTL_BUSYHANDLER,
241a0 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20   (void *)ap);.  
241b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
241c0 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
241d0 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
241e0 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
241f0 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
24200 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
24210 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
24220 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
24230 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
24240 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
24250 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
24260 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
24270 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
24280 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
24290 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
242a0 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
242b0 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
242c0 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
242d0 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f  R_xxx sub-code o
242e0 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
242f0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
24300 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
24310 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
24320 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
24330 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
24340 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
24350 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
24360 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
24370 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
24380 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
24390 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
243a0 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
243b0 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
243c0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
243d0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
243e0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
243f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
24400 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
24410 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
24420 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
24430 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
24440 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
24450 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
24460 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
24470 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
24480 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
24490 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
244a0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
244b0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
244c0 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
244d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
244e0 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
244f0 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
24500 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
24510 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
24520 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
24530 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
24540 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
24550 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
24560 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
24570 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
24580 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
24590 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
245a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
245b0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
245c0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
245d0 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
245e0 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
245f0 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
24600 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
24610 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
24620 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
24630 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
24640 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
24650 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
24660 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
24670 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
24680 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
24690 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
246a0 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
246b0 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
246c0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
246d0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
246e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
246f0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
24700 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33  ager *pPager, u3
24710 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  2 *pPageSize, in
24720 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
24730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24740 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  K;..  /* It is n
24750 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
24760 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f  o a full assert_
24770 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65  pager_state() he
24780 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a  re, as this.  **
24790 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
247a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
247b0 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c  hin PagerOpen(),
247c0 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
247d0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61  e.  ** of the Pa
247e0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  ger object is in
247f0 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
24800 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ent..  **.  ** A
24810 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
24820 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
24830 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
24840 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
24850 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f  .  ** PAGER_ERRO
24860 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e  R state. But sin
24870 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ce PAGER_ERROR s
24880 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20  tate guarantees 
24890 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20  that.  ** there 
248a0 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  is at least one 
248b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
248c0 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73   reference, this
248d0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
248e0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
248f0 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a  at case anyhow..
24900 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65    */..  u32 page
24910 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
24920 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
24930 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
24940 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
24950 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
24960 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
24970 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
24980 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
24990 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
249a0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
249b0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
249c0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
249d0 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
249e0 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32  & pageSize!=(u32
249f0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
24a00 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
24a10 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20   *pNew = NULL;  
24a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
24a30 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
24a40 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20      i64 nByte = 
24a50 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  0;..    if( pPag
24a60 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
24a70 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28  _OPEN && isOpen(
24a80 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
24a90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24aa0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
24ab0 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
24ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
24ad0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24ae0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
24af0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
24b00 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
24b10 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
24b20 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  w ) rc = SQLITE_
24b30 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24b40 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
24b50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24b60 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
24b70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
24b80 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
24b90 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
24ba0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
24bb0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
24bc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
24be0 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
24bf0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
24c00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
24c10 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
24c20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
24c30 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Size = (Pgno)((n
24c40 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29  Byte+pageSize-1)
24c50 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  /pageSize);.    
24c60 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
24c70 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
24c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24c90 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
24ca0 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNew);.    }.  }
24cb0 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  ..  *pPageSize =
24cc0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
24cd0 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
24ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24cf0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
24d00 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
24d10 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
24d20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
24d30 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
24d40 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
24d50 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
24d60 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
24d70 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
24d80 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
24d90 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
24da0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
24db0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24dc0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
24dd0 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
24de0 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
24df0 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
24e00 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
24e10 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
24e20 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
24e30 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
24e40 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
24e50 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
24e60 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
24e70 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
24e80 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
24e90 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
24ea0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
24eb0 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
24ec0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
24ed0 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
24ee0 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
24ef0 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
24f00 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
24f10 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
24f20 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
24f30 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
24f40 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
24f50 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
24f60 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
24f70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
24f80 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
24f90 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
24fa0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
24fb0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
24fc0 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
24fd0 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
24fe0 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
24ff0 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
25000 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
25010 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
25020 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
25030 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
25040 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
25050 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
25060 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
25070 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
25080 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
25090 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
250a0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
250b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
250c0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
250d0 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
250e0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
250f0 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61   mxPage;.  }.  a
25100 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25110 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
25120 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c  N );      /* Cal
25130 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d  led only by OP_M
25140 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73  axPgcnt */.  ass
25150 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
25160 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
25170 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61  ize );  /* OP_Ma
25180 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20  xPgcnt enforces 
25190 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  this */.  return
251a0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
251b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
251c0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
251d0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
251e0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
251f0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
25200 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
25210 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
25220 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
25230 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
25240 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
25250 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
25260 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
25270 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
25280 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
25290 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
252a0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
252b0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
252c0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
252d0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
252e0 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
252f0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
25300 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
25310 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
25320 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
25330 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
25340 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
25350 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25360 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
25370 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
25380 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
25390 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
253a0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
253b0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
253c0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
253d0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
253e0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
253f0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
25400 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
25410 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
25420 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
25430 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
25440 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25450 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
25460 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
25470 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
25480 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
25490 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
254a0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
254b0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
254c0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
254d0 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
254e0 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
254f0 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
25500 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
25510 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
25520 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
25530 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
25540 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
25550 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
25560 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
25570 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
25580 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
25590 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
255a0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
255b0 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
255c0 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
255d0 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
255e0 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
255f0 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
25600 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
25610 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
25620 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
25630 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
25640 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
25650 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
25660 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
25670 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
25680 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
25690 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
256a0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
256b0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
256c0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
256d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
256e0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
256f0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
25700 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
25710 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
25720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25730 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
25740 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
25750 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25760 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
25770 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
25780 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
25790 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
257a0 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
257b0 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
257c0 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
257d0 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
257e0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
257f0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
25800 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
25810 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
25820 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
25830 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
25840 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
25850 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
25860 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
25870 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
25880 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
25890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
258a0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
258b0 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
258c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
258d0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
258e0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
258f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25900 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
25910 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
25920 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
25930 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
25940 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
25950 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
25960 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
25970 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
25980 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
25990 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
259a0 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
259b0 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
259c0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
259d0 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
259e0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
259f0 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
25a00 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
25a10 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
25a20 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
25a30 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
25a40 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
25a50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25a60 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
25a70 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
25a80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25a90 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
25aa0 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
25ab0 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
25ac0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
25ad0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
25ae0 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
25af0 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
25b00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25b10 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
25b20 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
25b30 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
25b40 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
25b50 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
25b60 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
25b70 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
25b80 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
25b90 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
25ba0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
25bb0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
25bc0 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
25bd0 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
25be0 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
25bf0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
25c00 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
25c10 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
25c20 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
25c30 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
25c40 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
25c50 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
25c60 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
25c70 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
25c80 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
25c90 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
25ca0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
25cb0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
25cc0 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
25cd0 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
25ce0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
25cf0 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
25d00 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
25d10 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
25d20 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
25d30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
25d40 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
25d50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25d60 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
25d70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d90 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
25da0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
25db0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
25dc0 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
25dd0 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
25de0 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
25df0 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29  ** already held)
25e00 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
25e10 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74  transitions that
25e20 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
25e30 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
25e40 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
25e50 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
25e60 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
25e70 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
25e80 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
25e90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
25ea0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
25eb0 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
25ec0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
25ed0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
25ee0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
25ef0 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
25f00 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
25f10 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
25f20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
25f30 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
25f40 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
25f50 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
25f60 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
25f70 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
25f80 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
25f90 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
25fa0 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
25fb0 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
25fc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25fd0 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
25fe0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25ff0 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
26000 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
26010 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
26020 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
26030 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
26040 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
26050 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
26060 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
26070 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
26080 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
26090 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
260a0 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
260b0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
260c0 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
260d0 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
260e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
260f0 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
26100 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
26110 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
26120 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
26130 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
26140 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
26150 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
26160 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
26170 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
26180 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
26190 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
261a0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
261b0 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
261c0 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
261d0 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
261e0 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
261f0 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
26200 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
26210 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
26220 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
26230 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
26240 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
26250 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
26260 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
26270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26280 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
26290 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
262a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
262b0 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
262c0 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
262d0 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20   behavior would 
262e0 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
262f0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
26300 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
26310 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
26320 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
26330 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
26340 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
26350 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
26360 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
26370 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
26380 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
26390 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
263a0 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
263b0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
263c0 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
263d0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
263e0 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
263f0 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
26400 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
26410 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
26420 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
26430 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
26440 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
26450 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
26460 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26470 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
26480 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
26490 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
264a0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
264b0 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
264c0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
264d0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
264e0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
264f0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
26500 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26510 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
26520 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
26530 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
26540 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
26550 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
26560 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
26570 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
26580 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
26590 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
265a0 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
265b0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
265c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
265d0 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
265e0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
265f0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
26600 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
26610 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
26620 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
26630 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
26640 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
26650 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
26660 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
26670 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
26680 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
26690 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
266a0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
266b0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
266c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
266d0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
266e0 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
266f0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
26700 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63  nsaction..** Onc
26710 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
26720 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  has been called,
26730 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
26740 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 0a   must either be.
26750 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ** rolled back o
26760 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20  r committed. It 
26770 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63  is not safe to c
26780 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
26790 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f  n and.** then co
267a0 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74  ntinue writing t
267b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
267c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
267d0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
267e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
267f0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
26800 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26810 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
26820 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26830 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
26840 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
26850 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
26860 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20  Size = nPage;.. 
26870 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
26880 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 63   the code here c
26890 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e  alled assertTrun
268a0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
268b0 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
268c0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62  that all pages b
268d0 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61  eing truncated a
268e0 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65 72  way by this oper
268f0 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20  ation are,.  ** 
26900 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  if one or more s
26910 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70  avepoints are op
26920 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74  en, present in t
26930 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
26940 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ** journal so th
26950 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
26960 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73  estored if the s
26970 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c  avepoint is roll
26980 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68  ed.  ** back. Th
26990 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  is is no longer 
269a0 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 69  necessary as thi
269b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
269c0 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c  w only.  ** call
269d0 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
269e0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
269f0 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74  nsaction. So alt
26a00 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20  hough the .  ** 
26a10 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79  Pager object may
26a20 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e   still have open
26a30 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67   savepoints (Pag
26a40 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30  er.nSavepoint!=0
26a50 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61  ), .  ** they ca
26a60 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
26a70 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65  ack. So the asse
26a80 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26a90 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a  aint() call.  **
26aa0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f   is no longer co
26ab0 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  rrect. */.}.../*
26ac0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26ad0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
26ae0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
26af0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
26b00 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
26b10 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
26b20 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
26b30 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
26b40 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
26b50 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
26b60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
26b70 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
26b80 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
26b90 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
26ba0 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
26bb0 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
26bc0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
26bd0 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
26be0 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
26bf0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
26c00 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
26c10 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
26c20 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
26c30 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
26c40 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
26c50 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
26c60 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
26c70 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
26c80 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
26c90 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
26ca0 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
26cb0 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
26cc0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
26cd0 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
26ce0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
26cf0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
26d00 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
26d10 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
26d20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26d30 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
26d40 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
26d50 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26d60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
26d70 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
26d80 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
26d90 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
26da0 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
26db0 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
26dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26dd0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
26de0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
26df0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
26e00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26e10 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
26e20 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
26e30 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
26e40 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  >0./*.** Obtain 
26e50 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
26e60 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   memory mapped p
26e70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70  age object for p
26e80 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
26e90 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a   .** The new obj
26ea0 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ect will use the
26eb0 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20   pointer pData, 
26ec0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46  obtained from xF
26ed0 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75  etch()..** If su
26ee0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
26ef0 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74  pPage to point t
26f00 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72  o the new page r
26f10 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20  eference.** and 
26f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26f30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
26f40 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
26f50 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74  ror code and set
26f60 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a  .** *ppPage to z
26f70 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ero..**.** Page 
26f80 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69  references obtai
26f90 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ned by calling t
26fa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
26fb0 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a  uld be released.
26fc0 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61  ** by calling pa
26fd0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26fe0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
26ff0 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  nt pagerAcquireM
27000 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20  apPage(.  Pager 
27010 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
27020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
27030 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
27040 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
27050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27060 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  * Page number */
27070 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  .  void *pData, 
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27090 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64     /* xFetch()'d
270a0 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70   data for this p
270b0 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
270c0 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20  *ppPage         
270d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
270e0 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f   Acquired page o
270f0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67  bject */.){.  Pg
27100 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27120 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   Memory mapped p
27130 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  age to return */
27140 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72  .  .  if( pPager
27150 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
27160 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
27170 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d   p = pPager->pMm
27180 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  apFreelist;.    
27190 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
271a0 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74  elist = p->pDirt
271b0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
271c0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
271d0 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
271e0 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  >=8 );.    memse
271f0 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  t(p->pExtra, 0, 
27200 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  8);.  }else{.   
27210 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28   *ppPage = p = (
27220 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d  PgHdr *)sqlite3M
27230 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
27240 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72  (PgHdr) + pPager
27250 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69  ->nExtra);.    i
27260 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( p==0 ){.     
27270 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
27280 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
27290 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
272a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
272b0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65  pData);.      re
272c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
272d0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
272e0 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76    p->pExtra = (v
272f0 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  oid *)&p[1];.   
27300 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44   p->flags = PGHD
27310 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e  R_MMAP;.    p->n
27320 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e  Ref = 1;.    p->
27330 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
27340 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
27350 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64  p->pExtra==(void
27360 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73   *)&p[1] );.  as
27370 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d  sert( p->pPage==
27380 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
27390 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d  ->flags==PGHDR_M
273a0 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MAP );.  assert(
273b0 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67   p->pPager==pPag
273c0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
273d0 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20  p->nRef==1 );.. 
273e0 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b   p->pgno = pgno;
273f0 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44  .  p->pData = pD
27400 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ata;.  pPager->n
27410 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65  MmapOut++;..  re
27420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27430 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
27440 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
27450 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e  nce to page pPg.
27460 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62   pPg must have b
27470 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  een returned by 
27480 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63  an .** earlier c
27490 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75  all to pagerAcqu
274a0 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  ireMapPage()..*/
274b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
274c0 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
274d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
274e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
274f0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70  pPg->pPager;.  p
27500 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d  Pager->nMmapOut-
27510 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  -;.  pPg->pDirty
27520 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
27530 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67  Freelist;.  pPag
27540 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27550 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65  t = pPg;..  asse
27560 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  rt( pPager->fd->
27570 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
27580 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74  on>=3 );.  sqlit
27590 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
275a0 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50  er->fd, (i64)(pP
275b0 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  g->pgno-1)*pPage
275c0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67  r->pageSize, pPg
275d0 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pData);.}../*.
275e0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64  ** Free all PgHd
275f0 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64  r objects stored
27600 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d   in the Pager.pM
27610 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74  mapFreelist list
27620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27630 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
27640 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
27650 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
27660 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20  PgHdr *pNext;.  
27670 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d  for(p=pPager->pM
27680 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20  mapFreelist; p; 
27690 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
276a0 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ext = p->pDirty;
276b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
276c0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  e(p);.  }.}.../*
276d0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
276e0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
276f0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
27700 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
27710 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
27720 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
27730 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
27740 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
27750 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
27760 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
27770 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
27780 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
27790 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
277a0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
277b0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
277c0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
277d0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
277e0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
277f0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
27800 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
27810 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
27820 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
27830 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
27840 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27850 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
27860 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
27870 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
27880 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
27890 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
278a0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
278b0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
278c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
278d0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
278e0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
278f0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
27900 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
27910 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
27920 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
27930 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
27940 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
27950 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
27960 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a  u8 *pTmp = (u8 *
27970 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
27980 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  ce;..  assert( d
27990 62 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  b || pagerUseWal
279a0 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
279b0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
279c0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
279d0 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65  er) );.  disable
279e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
279f0 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
27a00 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
27a10 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65  oc();.  pagerFre
27a20 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72 29  eMapHdrs(pPager)
27a30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
27a40 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20  rrCode = 0; */. 
27a50 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
27a60 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
27a70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27a80 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 64 62  WAL.  assert( db
27a90 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61 6c   || pPager->pWal
27aa0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
27ab0 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
27ac0 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61 67 65  >pWal, db, pPage
27ad0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
27ae0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
27af0 7a 65 2c 0a 20 20 20 20 20 20 28 64 62 20 26 26  ze,.      (db &&
27b00 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
27b10 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f  LITE_NoCkptOnClo
27b20 73 65 29 20 3f 20 30 20 3a 20 70 54 6d 70 29 0a  se) ? 0 : pTmp).
27b30 20 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70    );.  pPager->p
27b40 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Wal = 0;.#endif.
27b50 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
27b60 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
27b70 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
27b80 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
27b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
27ba0 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
27bb0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
27bc0 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
27bd0 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
27be0 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
27bf0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
27c00 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
27c10 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
27c20 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
27c30 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
27c40 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
27c50 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
27c60 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
27c70 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
27c80 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
27c90 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
27ca0 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
27cb0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
27cc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
27cd0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
27ce0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
27cf0 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
27d00 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
27d10 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
27d20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
27d30 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
27d40 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
27d50 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
27d60 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
27d70 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
27d80 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
27d90 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
27da0 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
27db0 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
27dc0 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
27dd0 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
27de0 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
27df0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
27e00 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
27e10 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
27e20 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
27e30 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
27e40 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
27e50 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
27e60 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
27e70 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
27e80 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
27e90 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
27ea0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
27eb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
27ec0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
27ed0 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
27ee0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
27ef0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
27f00 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
27f10 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
27f20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
27f30 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
27f40 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
27f50 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
27f60 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
27f70 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
27f80 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
27f90 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
27fa0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
27fb0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
27fc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
27fd0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
27fe0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
27ff0 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
28000 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
28010 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
28020 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
28030 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
28040 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
28050 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
28060 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
28070 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
28080 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
28090 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
280a0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
280b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
280c0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
280d0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
280e0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
280f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
28100 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
28110 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
28120 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
28130 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
28140 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
28150 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
28160 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
28170 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
28180 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
28190 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
281a0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
281b0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
281c0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
281d0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
281e0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
281f0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
28200 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
28210 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
28220 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
28230 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
28240 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
28250 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
28260 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
28270 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
28280 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
28290 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
282a0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
282b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
282c0 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
282d0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
282e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
282f0 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
28300 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
28310 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
28320 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
28330 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
28340 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
28350 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c  stics of the fil
28360 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c  e-system, as fol
28370 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
28380 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
28390 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ile is an in-mem
283a0 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
283b0 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64  , no action need
283c0 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e  .**     be taken
283d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65  ..**.**   * Othe
283e0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65  rwise, if the de
283f0 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
28400 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41  pport the SAFE_A
28410 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a  PPEND property,.
28420 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20  **     then the 
28430 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
28440 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
28450 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
28460 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73  header.**     is
28470 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74   updated to cont
28480 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
28490 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  f journal record
284a0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
284b0 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20     been written 
284c0 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66  following it. If
284d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70   the pager is op
284e0 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d  erating in full-
284f0 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65  sync.**     mode
28500 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
28510 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
28520 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  d before this fi
28530 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a  eld is updated..
28540 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
28550 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
28560 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51   support the SEQ
28570 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79  UENTIAL property
28580 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a  , then .**     j
28590 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
285a0 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ynced..**.** Or,
285b0 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a   in pseudo-code:
285c0 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54  .**.**   if( NOT
285d0 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72   <in-memory jour
285e0 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69  nal> ){.**     i
285f0 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45  f( NOT SAFE_APPE
28600 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ND ){.**       i
28610 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f  f( <full-sync mo
28620 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  de> ) xSync(<jou
28630 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
28640 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52        <update nR
28650 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20  ec field>.**    
28660 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   } .**     if( N
28670 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20  OT SEQUENTIAL ) 
28680 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
28690 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  ile>);.**   }.**
286a0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
286b0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
286c0 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
286d0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
286e0 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
286f0 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
28700 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
28710 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
28720 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
28730 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
28740 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
28750 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
28760 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
28770 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
28780 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
28790 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
287a0 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b  er, int newHdr){
287b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
287e0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
287f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
28800 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
28810 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
28820 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
28830 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
28840 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
28850 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
28860 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
28870 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
28880 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
28890 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
288a0 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
288b0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
288c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
288d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
288e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
288f0 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
28900 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
28910 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
28920 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28930 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
28940 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
28950 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
28960 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63  EMORY ){.      c
28970 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
28980 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
28990 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
289a0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
289b0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
289c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
289d0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
289e0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
289f0 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
28a00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
28a10 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
28a20 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62   an obscure prob
28a30 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74  lem. If the last
28a40 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
28a50 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74      ** that wrot
28a60 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  e to this databa
28a70 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67  se was operating
28a80 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a   in persistent-j
28a90 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
28aa0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  * mode, then the
28ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
28ac0 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
28ad0 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67  actually be larg
28ae0 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
28af0 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  an Pager.journal
28b00 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68  Off bytes. If th
28b10 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20  e next thing in 
28b20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
28b30 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70      ** file happ
28b40 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72  ens to be a jour
28b50 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74  nal-header (writ
28b60 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74  ten as part of t
28b70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
28b80 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f  evious connectio
28b90 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  n's transaction)
28ba0 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72  , and a crash or
28bb0 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a   power-failure .
28bc0 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72          ** occur
28bd0 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20  s after nRec is 
28be0 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f  updated but befo
28bf0 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  re this connecti
28c00 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20  on writes .     
28c10 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65     ** anything e
28c20 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  lse to the journ
28c30 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d  al file (or comm
28c40 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69  its/rolls back i
28c50 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts .        ** t
28c60 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65  ransaction), the
28c70 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63  n SQLite may bec
28c80 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65  ome confused whe
28c90 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20  n doing the .   
28ca0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
28cb0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  nal rollback fol
28cc0 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e  lowing recovery.
28cd0 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63   It may roll bac
28ce0 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  k all.        **
28cf0 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
28d00 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20  ions data, then 
28d10 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69  proceed to rolli
28d20 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c  ng back the old,
28d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d  .        ** out-
28d40 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61  of-date data tha
28d50 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61  t follows it. Da
28d60 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
28d70 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
28d80 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b        ** To work
28d90 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
28da0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28db0 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f  e does appear to
28dc0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20   contain.       
28dd0 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64   ** a valid head
28de0 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67  er following Pag
28df0 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74  er.journalOff, t
28e00 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30  hen write a 0x00
28e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
28e20 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
28e30 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69   it to prevent i
28e40 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63  t from being rec
28e50 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20  ognized..       
28e60 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56   **.        ** V
28e70 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72  ariable iNextHdr
28e80 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
28e90 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77   the offset at w
28ea0 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20  hich this.      
28eb0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63    ** problematic
28ec0 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63   header will occ
28ed0 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ur, if it exists
28ee0 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64  . aMagic is used
28ef0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20   .        ** as 
28f00 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
28f10 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68  er to inspect th
28f20 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
28f30 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20  f bytes of.     
28f40 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74     ** the potent
28f50 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ial journal head
28f60 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
28f70 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74         i64 iNext
28f80 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
28f90 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
28fa0 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61  .        u8 zHea
28fb0 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28fc0 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20  nalMagic)+4];.. 
28fd0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48         memcpy(zH
28fe0 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
28ff0 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
29000 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
29010 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
29020 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
29030 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
29040 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
29050 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64  .        iNextHd
29060 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61  rOffset = journa
29070 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
29080 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
29090 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
290a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
290b0 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
290c0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
290d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
290e0 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
290f0 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
29100 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
29110 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
29120 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
29130 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
29140 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
29150 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
29160 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
29170 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
29180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
291a0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
291b0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
291c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
291d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
291e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
291f0 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
29200 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
29210 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
29220 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
29230 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
29240 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
29250 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
29260 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
29270 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
29280 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
29290 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
292a0 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
292b0 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
292c0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
292d0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
292e0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
292f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29300 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
29310 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
29320 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
29330 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
29340 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
29350 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
29360 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
29370 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
29380 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
29390 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
293a0 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
293b0 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
293c0 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
293d0 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
293e0 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
293f0 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
29400 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
29410 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
29420 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
29430 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
29440 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29450 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
29460 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
29470 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
29480 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
29490 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
294a0 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
294b0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
294c0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
294d0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
294e0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
294f0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
29500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29510 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
29520 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
29530 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
29540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29550 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29570 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
29580 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
29590 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
295a0 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
295b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
295c0 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
295d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
295e0 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
295f0 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
29600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
29610 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29630 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29650 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
29660 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
29670 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
29680 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
29690 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
296a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
296b0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
296c0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
296d0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
296e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
296f0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
29700 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
29710 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  ncFlags| .      
29720 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
29730 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  cFlags==SQLITE_S
29740 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
29750 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
29760 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
29770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29780 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
29790 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
297a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
297b0 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
297c0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20  ournalOff;.     
297d0 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30   if( newHdr && 0
297e0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
297f0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
29800 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
29810 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
29820 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
29830 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
29840 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
29850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29870 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
29880 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
29890 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
298a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
298b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c   }.  }..  /* Unl
298c0 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
298d0 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c   in noSync mode,
298e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
298f0 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a  e was just .  **
29900 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
29910 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  nced. Either way
29920 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  , clear the PGHD
29930 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
29940 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61   on .  ** all pa
29950 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ges..  */.  sqli
29960 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
29970 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
29980 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67  pPCache);.  pPag
29990 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
299a0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b  ER_WRITER_DBMOD;
299b0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
299c0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
299d0 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
299e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
299f0 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
29a00 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
29a10 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
29a20 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
29a30 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20  connected.** by 
29a40 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
29a50 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66   pointer. This f
29a60 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65  unction writes e
29a70 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  ach one of the.*
29a80 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  * in-memory page
29a90 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f  s in the list to
29aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29ab0 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
29ac0 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c   may.** be NULL,
29ad0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
29ae0 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20   empty list. In 
29af0 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
29b00 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  unction is.** a 
29b10 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
29b20 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64   pager must hold
29b30 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
29b40 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74  RVED lock when t
29b50 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
29b60 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72  is called. Befor
29b70 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69  e writing anythi
29b80 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
29b90 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f  se file, this lo
29ba0 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65  ck.** is upgrade
29bb0 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
29bc0 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  E lock. If the l
29bd0 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
29be0 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  tained,.** SQLIT
29bf0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
29c00 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69  ed and no data i
29c10 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
29c20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29c30 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
29c40 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ger is a temp-fi
29c50 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  le pager and the
29c60 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73   actual file-sys
29c70 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e  tem file.** is n
29c80 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20  ot yet open, it 
29c90 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f  is created and o
29ca0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79  pened before any
29cb0 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69   data is .** wri
29cc0 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  tten out..**.** 
29cd0 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  Once the lock ha
29ce0 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20  s been upgraded 
29cf0 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
29d00 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  y, the file open
29d10 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ed,.** the pages
29d20 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74   are written out
29d30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29d40 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72   file in list or
29d50 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20  der. Writing.** 
29d60 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65  a page is skippe
29d70 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69  d if it meets ei
29d80 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ther of the foll
29d90 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a  owing criteria:.
29da0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
29db0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  ge number is gre
29dc0 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e  ater than Pager.
29dd0 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20  dbSize, or.**   
29de0 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  * The PGHDR_DONT
29df0 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73  _WRITE flag is s
29e00 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  et on the page..
29e10 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67  **.** If writing
29e20 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73   out a page caus
29e30 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
29e40 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61  file to grow, Pa
29e50 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ger.dbFileSize.*
29e60 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  * is updated acc
29e70 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67  ordingly. If pag
29e80 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f  e 1 is written o
29e90 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ut, then the val
29ea0 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20  ue cached.** in 
29eb0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
29ec0 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  [] is updated to
29ed0 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76   match the new v
29ee0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
29ef0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
29f00 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
29f10 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
29f20 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
29f30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
29f40 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
29f50 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  * occurs, an IO 
29f60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29f70 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
29f80 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
29f90 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f  k cannot.** be o
29fa0 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f  btained, SQLITE_
29fb0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
29fc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29fd0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
29fe0 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67  list(Pager *pPag
29ff0 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74  er, PgHdr *pList
2a000 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a010 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2a020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a030 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
2a040 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a050 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
2a060 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  or rollback page
2a070 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  rs in WRITER_DBM
2a080 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  OD state. */.  a
2a090 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
2a0a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2a0b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a0c0 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70 50 61  >tempFile || pPa
2a0d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2a0e0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
2a0f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2a100 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
2a110 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
2a120 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2a130 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 4c  Pager->fd) || pL
2a140 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 29  ist->pDirty==0 )
2a150 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
2a160 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
2a170 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
2a180 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
2a190 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
2a1a0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
2a1b0 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
2a1c0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
2a1d0 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
2a1e0 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
2a1f0 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
2a200 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
2a210 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
2a220 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
2a230 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2a240 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
2a250 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2a260 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
2a270 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
2a280 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
2a290 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
2a2a0 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
2a2b0 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  gs);.  }..  /* B
2a2c0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
2a2d0 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20  write, give the 
2a2e0 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68  VFS a hint of wh
2a2f0 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a  at the final.  *
2a300 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c  * file size will
2a310 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65   be..  */.  asse
2a320 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2a330 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2a340 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28  er->fd) );.  if(
2a350 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc==SQLITE_OK .
2a360 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
2a370 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d  HintSize<pPager-
2a380 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70  >dbSize.   && (p
2a390 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20  List->pDirty || 
2a3a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67  pList->pgno>pPag
2a3b0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a  er->dbHintSize).
2a3c0 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
2a3d0 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
2a3e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a3f0 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
2a400 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
2a410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
2a420 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
2a430 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
2a440 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
2a450 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20  T, &szFile);.   
2a460 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
2a470 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2a480 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Size;.  }..  whi
2a490 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2a4a0 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
2a4b0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c    Pgno pgno = pL
2a4c0 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20  ist->pgno;..    
2a4d0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
2a4e0 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
2a4f0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
2a500 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
2a510 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
2a520 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
2a530 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
2a540 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
2a550 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
2a560 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
2a570 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
2a580 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
2a590 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
2a5a0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
2a5b0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
2a5c0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
2a5d0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
2a5e0 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74   ** Also, do not
2a5f0 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70   write out any p
2a600 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65  age that has the
2a610 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
2a620 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65  E flag.    ** se
2a630 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65  t (set by sqlite
2a640 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2a650 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ))..    */.    i
2a660 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
2a670 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
2a680 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
2a690 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
2a6a0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2a6b0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
2a6c0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
2a6d0 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ze;   /* Offset 
2a6e0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
2a6f0 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
2a730 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20  e */    ..      
2a740 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e  assert( (pList->
2a750 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2a760 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
2a770 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
2a780 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
2a790 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
2a7a0 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20  r(pList);..     
2a7b0 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
2a7c0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
2a7d0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2a7e0 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
2a7f0 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
2a800 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
2a810 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
2a820 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
2a830 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
2a840 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a850 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2a860 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
2a870 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
2a880 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
2a890 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
2a8a0 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
2a8b0 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
2a8c0 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
2a8d0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
2a8e0 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
2a8f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a900 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
2a910 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
2a920 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
2a930 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
2a940 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
2a950 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
2a960 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
2a970 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
2a980 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
2a990 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
2a9a0 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
2a9b0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
2a9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a9d0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
2a9e0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
2a9f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
2aa00 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
2aa10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2aa20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
2aa30 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b  GER_STAT_WRITE]+
2aa40 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  +;..      /* Upd
2aa50 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
2aa60 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
2aa70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2aa80 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
2aa90 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
2aaa0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
2aab0 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
2aac0 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
2aad0 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
2aae0 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
2aaf0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
2ab00 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
2ab10 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
2ab20 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
2ab30 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2ab40 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
2ab50 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
2ab60 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
2ab70 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
2ab80 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
2ab90 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
2aba0 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c  _count);.    }el
2abb0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
2abc0 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25  RACE(("NOSTORE %
2abd0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2abe0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2abf0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
2ac00 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
2ac10 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ash(pList);.    
2ac20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
2ac30 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
2ac40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2ac50 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
2ac60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
2ac70 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69  le is open. If i
2ac80 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
2ac90 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n, this .** func
2aca0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2acb0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2acc0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2acd0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
2ace0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
2acf0 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
2ad00 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
2ad10 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2ad20 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73  d if a call to s
2ad30 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a  qlite3OsOpen() .
2ad40 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  ** fails..*/.sta
2ad50 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
2ad60 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2ad70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2ad80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2ad90 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2ada0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
2adb0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
2adc0 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  =  SQLITE_OPEN_S
2add0 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c 49  UBJOURNAL | SQLI
2ade0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2adf0 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54  E .      | SQLIT
2ae00 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
2ae10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
2ae20 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20 53  USIVE .      | S
2ae30 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
2ae40 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69 6e  EONCLOSE;.    in
2ae50 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 73  t nStmtSpill = s
2ae60 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74  qlite3Config.nSt
2ae70 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66 28  mtSpill;.    if(
2ae80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ae90 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2aea0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
2aeb0 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
2aec0 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
2aed0 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31 3b  nStmtSpill = -1;
2aee0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2aef0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
2af00 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
2af10 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64   0, pPager->sjfd
2af20 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53 70  , flags, nStmtSp
2af30 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ill);.  }.  retu
2af40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2af50 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
2af60 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2af70 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
2af80 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2af90 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  nal. .**.** If s
2afa0 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
2afb0 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
2afc0 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e  ding to pPg->pgn
2afd0 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73  o in the bitvecs
2afe0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e  .** for all open
2aff0 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f   savepoints befo
2b000 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2b010 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2b020 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2b030 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
2b040 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
2b050 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
2b060 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65  code if the atte
2b070 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
2b080 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2b090 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51  fails, or .** SQ
2b0a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
2b0b0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69  malloc fails whi
2b0c0 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74  le setting a bit
2b0d0 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a   in a savepoint.
2b0e0 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74  ** bitvec..*/.st
2b0f0 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
2b100 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70  nalPage(PgHdr *p
2b110 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
2b120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
2b130 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2b140 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
2b150 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2b160 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
2b170 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20  ALMODE_OFF ){.. 
2b180 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
2b190 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  ub-journal, if i
2b1a0 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
2b1b0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f  y been opened */
2b1c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2b1d0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2b1e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2b1f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2b200 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  d) || pagerUseWa
2b210 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
2b220 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2b230 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c  pPager->sjfd) ||
2b240 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2b250 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2b260 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
2b270 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20  Pager) .        
2b280 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61   || pageInJourna
2b290 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a  l(pPager, pPg) .
2b2a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
2b2b0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
2b2c0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
2b2d0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2b2e0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2b2f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b300 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
2b310 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
2b320 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
2b330 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
2b340 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
2b350 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
2b360 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
2b370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
2b390 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
2b3a0 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
2b3b0 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
2b3c0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
2b3d0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
2b3e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ize);.      char
2b3f0 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20   *pData2;.  .   
2b400 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2b410 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2b420 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
2b430 70 44 61 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c  pData;.      }el
2b440 73 65 7b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  se{.        CODE
2b450 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
2b460 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
2b470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b480 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32  MEM_BKPT, pData2
2b490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b4a0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2b4b0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2b4c0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2b4d0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2b4e0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2b4f0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2b500 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2b510 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2b520 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2b530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b550 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2b560 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2b570 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2b580 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2b590 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2b5a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b5b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2b5c0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2b5d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2b5e0 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2b5f0 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2b600 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2b610 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2b620 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b630 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
2b640 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2b650 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a  Required(PgHdr *
2b660 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a  pPg){.  if( subj
2b670 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2b680 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2b690 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2b6a0 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
2b6b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b6c0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
2b6d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2b6e0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2b6f0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2b700 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2b710 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2b720 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2b730 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2b740 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2b750 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2b760 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2b770 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2b780 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2b790 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2b7a0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2b7b0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2b7c0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2b7d0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2b7e0 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2b7f0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2b800 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2b810 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2b820 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2b830 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2b840 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2b850 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2b860 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2b870 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2b880 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2b890 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2b8a0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2b8b0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2b8c0 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2b8d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b8e0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2b8f0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2b900 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2b910 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2b920 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2b930 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2b940 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2b950 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2b960 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2b970 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2b980 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2b990 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2b9a0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2b9b0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2b9c0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2b9d0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2b9e0 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2b9f0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2ba00 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2ba10 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2ba20 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2ba30 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2ba40 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2ba50 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2ba60 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2ba70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2ba80 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2ba90 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2baa0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2bab0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2bac0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2bad0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2bae0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2baf0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2bb00 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2bb10 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2bb20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2bb30 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2bb40 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2bb50 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2bb60 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2bb70 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2bb80 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2bb90 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2bba0 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2bbb0 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2bbc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2bbd0 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2bbe0 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2bbf0 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2bc00 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2bc10 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2bc20 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2bc30 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2bc40 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2bc50 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2bc60 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2bc70 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2bc80 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2bc90 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2bca0 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2bcb0 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2bcc0 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2bcd0 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2bce0 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2bcf0 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2bd00 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2bd10 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2bd20 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2bd30 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2bd40 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2bd50 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2bd60 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2bd70 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2bd80 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2bd90 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2bda0 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2bdb0 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2bdc0 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2bdd0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2bde0 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2bdf0 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2be00 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2be10 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2be20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2be30 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2be40 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2be50 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2be60 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2be70 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2be80 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2be90 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2bea0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2beb0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2bec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bed0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2bee0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2bef0 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2bf00 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2bf10 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2bf20 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2bf30 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2bf40 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2bf50 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2bf60 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2bf70 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2bf80 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2bf90 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2bfa0 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2bfb0 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2bfc0 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2bfd0 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2bfe0 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2bff0 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2c000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c010 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2c020 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2c030 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2c040 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2c050 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2c060 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2c070 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2c080 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2c090 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2c0a0 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28  d(pPg); .    if(
2c0b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c0c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2c0d0 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2c0e0 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2c0f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2c100 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2c110 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2c120 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2c130 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2c140 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2c150 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2c160 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2c170 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2c180 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2c190 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2c1a0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2c1b0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2c1c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2c1d0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2c1e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c1f0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2c200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2c220 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c230 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2c240 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2c250 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2c260 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2c270 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2c280 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2c290 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2c2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c2b0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2c2c0 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2c2d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2c2e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2c2f0 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2c300 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2c310 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2c320 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2c330 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2c340 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2c350 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2c360 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2c370 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2c380 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2c390 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2c3a0 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2c3b0 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2c3c0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2c3d0 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2c3e0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2c3f0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2c400 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2c410 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2c420 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2c430 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2c440 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2c450 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2c460 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2c470 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2c480 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2c490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2c4a0 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2c4b0 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2c4c0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2c4d0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2c4e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2c4f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2c500 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2c510 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2c520 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2c530 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2c540 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2c550 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2c560 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2c570 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2c580 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2c590 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2c5a0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2c5b0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2c5c0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2c5d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c5e0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2c5f0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2c600 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2c610 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2c620 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2c630 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2c640 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2c650 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2c660 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2c670 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2c680 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2c690 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2c6a0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2c6b0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2c6c0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2c6d0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2c6e0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2c6f0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2c700 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2c710 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2c720 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2c730 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2c740 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2c750 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2c760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2c770 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2c780 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2c790 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2c7a0 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2c7b0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2c7c0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2c7d0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2c7e0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2c7f0 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65 77 20  PI.  When a new 
2c800 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
2c810 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  d, the.** first 
2c820 38 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  8 bytes of this 
2c830 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f 65 64  space are zeroed
2c840 20 62 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64   but the remaind
2c850 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69  er is uninitiali
2c860 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74  zed..** (The ext
2c870 72 61 20 73 70 61 63 65 20 69 73 20 75 73 65 64  ra space is used
2c880 20 62 79 20 62 74 72 65 65 20 61 73 20 74 68 65   by btree as the
2c890 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e   MemPage object.
2c8a0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ).**.** The flag
2c8b0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2c8c0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2c8d0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2c8e0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2c8f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2c900 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2c910 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2c920 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2c930 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2c940 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2c950 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2c960 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2c970 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2c980 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2c990 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2c9a0 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2c9b0 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2c9c0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2c9d0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2c9e0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2c9f0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2ca00 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2ca10 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2ca20 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2ca30 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2ca40 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2ca50 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2ca60 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2ca70 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2ca80 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2ca90 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2caa0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2cab0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2cac0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2cad0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2cae0 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2caf0 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2cb00 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2cb10 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2cb20 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2cb30 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2cb40 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2cb50 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2cb60 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2cb70 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2cb80 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2cb90 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2cba0 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2cbb0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2cbc0 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2cbd0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2cbe0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2cbf0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2cc00 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2cc10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cc20 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2cc30 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2cc40 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2cc50 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2cc60 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2cc70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2cc80 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2cc90 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2cca0 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2ccb0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2ccc0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2ccd0 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2cce0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2ccf0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2cd00 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2cd10 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2cd20 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2cd30 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2cd40 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2cd50 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2cd60 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2cd70 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2cd80 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2cd90 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2cda0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2cdb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2cdc0 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2cdd0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2cde0 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2cdf0 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2ce00 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2ce10 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2ce20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2ce30 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ce40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2ce50 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2ce60 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2ce70 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2ce80 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2ce90 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2cea0 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2ceb0 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2cec0 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2ced0 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2cee0 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2cef0 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2cf00 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2cf10 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2cf20 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2cf30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2cf40 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2cf50 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2cf60 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2cf70 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2cf80 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2cf90 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2cfa0 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2cfb0 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2cfc0 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2cfd0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2cfe0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2cff0 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2d000 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2d010 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2d020 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2d030 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2d040 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2d050 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2d060 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2d070 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2d080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2d090 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2d0a0 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2d0b0 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2d0c0 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2d0d0 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2d0e0 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2d0f0 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2d100 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2d110 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2d120 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2d130 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2d140 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c  ).  */.  journal
2d150 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2d160 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
2d170 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20 20  Size(pVfs));..  
2d180 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2d190 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2d1a0 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2d1b0 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2d1c0 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2d1d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d1e0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2d1f0 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2d200 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2d210 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2d220 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2d230 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2d240 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2d250 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2d260 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2d270 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2d280 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2d290 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2d2a0 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e  PT;.      nPathn
2d2b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2d2c0 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2d2d0 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ;.      zFilenam
2d2e0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
2d2f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
2d300 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
2d310 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2d320 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
2d330 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
2d340 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
2d350 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
2d360 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
2d370 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
2d380 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
2d390 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
2d3a0 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
2d3b0 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
2d3c0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2d3d0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2d3e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d3f0 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68  ar *z;.    nPath
2d400 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
2d410 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
2d420 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d430 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
2d440 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20   nPathname*2);. 
2d450 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2d460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2d470 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d480 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2d490 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2d4a0 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2d4b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2d4c0 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2d4d0 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2d4e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2d4f0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2d500 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2d510 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2d520 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2d530 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2d540 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2d550 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2d560 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2d570 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2d580 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2d590 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2d5a0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2d5b0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2d5c0 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2d5d0 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2d5e0 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2d5f0 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2d600 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2d610 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2d620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d630 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2d640 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2d650 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2d660 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2d670 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2d680 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2d690 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2d6a0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2d6b0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2d6c0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2d6d0 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2d6e0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2d6f0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2d700 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2d710 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2d720 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2d730 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2d740 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2d750 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2d760 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2d770 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2d780 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2d790 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d7a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2d7b0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2d7c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d7d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d7e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d7f0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2d800 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d810 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2d820 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2d830 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2d840 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2d850 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2d860 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2d870 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2d880 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2d890 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2d8a0 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2d8b0 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2d8c0 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2d8d0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2d8e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2d910 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2d920 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d940 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2d950 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2d960 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2d970 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2d980 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2d990 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2d9a0 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2d9b0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2d9c0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2d9d0 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2d9e0 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2d9f0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2da00 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2da10 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2da20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2da30 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2da40 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2da50 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2da60 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2da70 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2da80 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2da90 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2daa0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2dab0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2dac0 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2dad0 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2dae0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2daf0 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2db00 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2db10 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2db20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2db30 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2db40 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2db50 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2db60 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2db70 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2db80 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2db90 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2dba0 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2dbb0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2dbc0 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2dbd0 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2dbe0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2dbf0 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2dc00 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2dc10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dc20 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2dc30 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2dc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2dc50 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2dc60 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2dc70 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2dc80 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2dc90 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2dca0 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2dcb0 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2dcc0 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2dcd0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2dce0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2dcf0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
2dd00 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2dd10 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2dd20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2dd30 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2dd40 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2dd50 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2dd60 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2dd70 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2dd80 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2dd90 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2dda0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2ddb0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2ddc0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2ddd0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2dde0 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2ddf0 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2de00 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2de10 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2de20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2de30 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2de40 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2de50 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2de60 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2de70 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2de80 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2de90 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2dea0 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2deb0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2dec0 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2ded0 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2dee0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2def0 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2df00 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2df10 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2df20 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2df30 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2df40 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2df50 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2df60 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2df70 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2df80 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2df90 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2dfa0 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2dfb0 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2dfc0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2dfd0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2dfe0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2dff0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2e000 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2e010 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2e020 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2e030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2e040 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2e050 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2e060 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2e070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e080 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2e090 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2e0a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2e0b0 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2e0c0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2e0d0 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2e0e0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2e0f0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2e100 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2e110 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2e120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2e130 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2e140 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2e150 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2e160 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2e170 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2e180 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2e190 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2e1a0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2e1b0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2e1c0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2e1d0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2e1e0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2e1f0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2e200 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2e210 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e220 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2e230 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2e240 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2e250 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2e260 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2e270 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2e280 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2e290 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2e2a0 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2e2b0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2e2c0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2e2d0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2e2e0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2e2f0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2e300 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2e310 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2e320 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2e330 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2e340 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2e350 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2e360 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2e370 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2e380 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2e390 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2e3a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2e3b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2e3c0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2e3d0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2e3e0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2e3f0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2e400 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2e410 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2e420 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2e430 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2e440 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2e450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e460 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
2e470 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2e480 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2e490 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2e4a0 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e       if( !readOn
2e4b0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
2e4c0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2e4d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
2e4e0 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2e4f0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2e500 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e510 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2e520 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2e530 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2e540 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2e550 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e560 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2e570 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e580 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2e590 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e5a0 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2e5b0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e5c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2e5d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2e5e0 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2e5f0 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2e600 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
2e610 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
2e620 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2e630 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2e640 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2e650 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2e660 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e670 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2e680 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2e690 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2e6a0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2e6b0 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2e6c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2e6d0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2e6e0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e6f0 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2e700 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2e710 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2e720 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e730 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2e740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e750 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2e760 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2e770 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2e780 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2e790 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2e7a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e7b0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2e7c0 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
2e7d0 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e7e0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2e7f0 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2e800 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20  "nolock", 0);.  
2e810 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53      if( (iDc & S
2e820 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55  QLITE_IOCAP_IMMU
2e830 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20  TABLE)!=0.      
2e840 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   || sqlite3_uri_
2e850 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2e860 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20  e, "immutable", 
2e870 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2e880 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  vfsFlags |= SQLI
2e890 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e8a0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2e8b0 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66   act_like_temp_f
2e8c0 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
2e8d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2e8e0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2e8f0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2e900 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2e910 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2e920 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2e930 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2e940 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2e950 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2e960 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2e970 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2e980 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2e990 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2e9a0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2e9b0 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2e9c0 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2e9d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2e9e0 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2e9f0 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2ea00 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2ea10 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2ea20 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2ea30 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2ea40 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2ea50 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2ea60 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2ea70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2ea80 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75  s branch also ru
2ea90 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72  ns for files mar
2eaa0 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ked as immutable
2eab0 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69  ..    */ .act_li
2eac0 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20  ke_temp_file:.  
2ead0 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2eae0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2eaf0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2eb00 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  R;     /* Preten
2eb10 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  d we already hav
2eb20 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  e a lock */.    
2eb30 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2eb40 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20  EXCLUSIVE_LOCK; 
2eb50 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2eb60 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56   are in EXCLUSIV
2eb70 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50  E mode */.    pP
2eb80 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31  ager->noLock = 1
2eb90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eba0 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e   /* Do no lockin
2ebb0 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c  g */.    readOnl
2ebc0 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2ebd0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2ebe0 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2ebf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2ec00 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2ec10 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2ec20 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2ec30 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2ec40 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2ec50 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2ec60 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2ec70 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2ec80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ec90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2eca0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2ecb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ecc0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2ecd0 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2ece0 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2ecf0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2ed00 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2ed10 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2ed20 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2ed30 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2ed40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ed50 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2ed60 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 61 73 73  nExtra);.    ass
2ed70 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 38 20 26  ert( nExtra>=8 &
2ed80 26 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  & nExtra<1000 );
2ed90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2eda0 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
2edb0 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
2edc0 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2ede0 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2edf0 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2ee00 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2ee10 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ache);.  }..  /*
2ee20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2ee30 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65  urred above, fre
2ee40 65 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72  e the  Pager str
2ee50 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2ee60 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2ee70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ee80 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2ee90 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2eea0 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
2eeb0 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
2eec0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
2eed0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2eee0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2eef0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
2ef00 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
2ef10 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
2ef20 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
2ef30 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
2ef40 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
2ef50 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
2ef60 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2ef70 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2ef80 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
2ef90 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
2efa0 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50  Journal;.  /* pP
2efb0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
2efc0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2efd0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
2efe0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2eff0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
2f000 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2f010 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
2f020 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
2f030 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2f040 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
2f050 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2f060 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
2f070 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
2f080 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2f090 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
2f0a0 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
2f0b0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2f0c0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2f0d0 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2f0e0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2f0f0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2f100 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2f110 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2f120 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2f130 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2f140 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2f150 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2f160 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2f170 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2f180 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2f190 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2f1a0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2f1b0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2f1c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2f1d0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2f1e0 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2f1f0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2f200 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2f210 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2f220 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2f230 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2f240 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2f250 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2f260 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2f270 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
2f280 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
2f290 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2f2a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2f2b0 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  xtraSync==0 );. 
2f2c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2f2d0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20  r->syncFlags==0 
2f2e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f2f0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2f300 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2f310 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b  sert( pPager->ck
2f320 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ptSyncFlags==0 )
2f330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2f340 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2f350 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2f360 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
2f370 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2f380 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2f390 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2f3a0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2f3b0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2f3c0 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2f3d0 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2f3e0 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2f3f0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2f400 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2f410 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2f420 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2f430 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f440 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2f450 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f460 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2f470 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2f480 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2f490 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2f4a0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2f4b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2f4c0 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2f4d0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2f4e0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2f4f0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2f500 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2f510 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2f520 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2f530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2f540 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2f550 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2f560 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2f570 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2f580 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2f590 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2f5a0 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2f5b0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2f5c0 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2f5d0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2f5e0 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2f5f0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2f600 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2f610 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
2f620 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65  pPager);.  /* me
2f630 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2f640 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2f650 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2f660 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2f670 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
2f680 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
2f690 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
2f6a0 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
2f6b0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2f6c0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2f6d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56  ITE_OK;.}.../* V
2f6e0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
2f6f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2f700 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
2f710 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
2f720 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
2f730 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
2f740 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2f750 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
2f760 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74  ll were it ought
2f770 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73  .** to be on dis
2f780 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  k.  Return non-z
2f790 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44  ero (SQLITE_READ
2f7a0 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20  ONLY_DBMOVED or 
2f7b0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2f7c0 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  .** code from sq
2f7d0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29  lite3OsAccess())
2f7e0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2f7f0 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e   has gone missin
2f800 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2f810 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
2f820 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2f830 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76  ){.  int bHasMov
2f840 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ed = 0;.  int rc
2f850 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2f860 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75  >tempFile ) retu
2f870 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f880 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2f890 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ze==0 ) return S
2f8a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2f8b0 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  rt( pPager->zFil
2f8c0 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d  ename && pPager-
2f8d0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b  >zFilename[0] );
2f8e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
2f8f0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
2f900 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2f910 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c  FCNTL_HAS_MOVED,
2f920 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20   &bHasMoved);.  
2f930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
2f940 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f  OTFOUND ){.    /
2f950 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56  * If the HAS_MOV
2f960 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
2f970 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  is unimplemented
2f980 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2f990 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61  e file.    ** ha
2f9a0 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64  s not been moved
2f9b0 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68  .  That is the h
2f9c0 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69  istorical behavi
2f9d0 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72  or of SQLite: pr
2f9e0 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65  ior to.    ** ve
2f9f0 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20  rsion 3.8.3, it 
2fa00 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f  never checked */
2fa10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2fa20 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2fa30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2fa40 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20  & bHasMoved ){. 
2fa50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
2fa60 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b  EADONLY_DBMOVED;
2fa70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2fa80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2fa90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2faa0 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2fab0 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2fac0 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2fad0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2fae0 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2faf0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2fb00 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2fb10 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2fb20 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2fb30 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2fb40 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2fb50 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2fb60 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2fb70 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2fb80 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2fb90 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2fba0 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2fbb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2fbc0 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2fbd0 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2fbe0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2fbf0 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2fc00 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2fc10 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2fc20 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2fc30 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2fc40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2fc50 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2fc60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2fc70 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2fc80 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2fc90 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2fca0 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2fcb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2fcc0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2fcd0 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2fce0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2fcf0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2fd00 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2fd10 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2fd20 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2fd30 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2fd40 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2fd50 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2fd60 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2fd70 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2fd80 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2fd90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fda0 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2fdb0 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2fdc0 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2fdd0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2fde0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2fdf0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2fe00 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2fe10 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2fe20 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2fe30 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2fe40 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2fe50 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2fe60 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2fe70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2fe80 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2fe90 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2fea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2feb0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2fec0 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2fed0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2fee0 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2fef0 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2ff00 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2ff10 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2ff20 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2ff30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ff40 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2ff50 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2ff60 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2ff70 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2ff80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2ff90 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2ffa0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2ffb0 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2ffc0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2ffd0 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2ffe0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2fff0 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
30000 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
30010 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
30020 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
30030 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
30040 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
30050 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
30060 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
30070 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
30080 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
30090 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
300a0 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
300b0 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
300c0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
300d0 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
300e0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
300f0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
30100 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
30110 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
30120 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
30130 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30140 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
30150 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30160 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
30170 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
30180 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
30190 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
301a0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
301b0 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
301c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
301d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
301e0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
301f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
30200 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
30210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30220 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30230 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
30240 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
30250 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
30260 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
30270 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
30280 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
30290 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
302a0 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
302b0 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
302c0 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
302d0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
302e0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
302f0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
30300 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
30310 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
30320 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
30330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30340 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
30350 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
30360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30370 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
30380 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
30390 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
303a0 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
303b0 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
303c0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
303d0 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
303e0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
303f0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
30400 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
30410 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
30420 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
30430 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
30440 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
30450 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
30460 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
30470 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
30480 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
30490 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
304a0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
304b0 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
304c0 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
304d0 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
304e0 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
304f0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
30500 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
30510 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
30520 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
30530 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
30540 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
30550 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
30560 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
30570 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
30580 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
30590 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
305a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
305b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
305c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
305d0 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
305e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
305f0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
30600 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30620 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
30630 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
30640 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
30650 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
30660 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ile==0 );.      
30670 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
30680 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
30690 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
306a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
306b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
306c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65  e database is ze
306d0 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ro pages in size
306e0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
306f0 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65  t either (1) the
30700 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
30710 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74  nal is a remnant
30720 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61   from a prior da
30730 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
30740 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a  same name where.
30750 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
30760 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74  atabase file but
30770 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
30780 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72   was deleted, or
30790 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c   (2) the initial
307a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
307b0 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70  saction that pop
307c0 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74  ulates a new dat
307d0 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72  abase is being r
307e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
307f0 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
30800 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e   case, the journ
30810 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64  al file can be d
30820 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72  eleted.  However
30830 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20  , take care.    
30840 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65      ** not to de
30850 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
30860 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61   file if it is a
30870 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20  lready open due 
30880 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  to.        ** jo
30890 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
308a0 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ST..        */. 
308b0 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
308c0 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e  ==0 && !jrnlOpen
308d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
308e0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
308f0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
30900 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
30910 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
30920 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
30930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30940 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
30950 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
30960 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
30970 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30980 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
30990 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
309a0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
309b0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
309c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
309d0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
309e0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
309f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30a00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
30a10 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
30a20 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
30a30 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
30a40 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
30a50 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
30a60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30a70 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
30a80 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
30a90 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
30aa0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
30ab0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
30ac0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
30ad0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
30ae0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
30af0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
30b00 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
30b10 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
30b20 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
30b30 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
30b40 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
30b50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30b60 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
30b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
30b80 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
30b90 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
30ba0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30bb0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
30bc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30bd0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
30be0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
30bf0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
30c00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30c10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
30c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30c30 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
30c40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
30c50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
30c60 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
30c70 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
30c80 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
30c90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30ca0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
30cb0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
30cc0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30cd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
30ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30cf0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30d00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30d10 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
30d20 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
30d30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30d40 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
30d50 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
30d60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
30d70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
30d80 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
30d90 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
30da0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
30db0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
30dc0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
30dd0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
30de0 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
30df0 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
30e00 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
30e10 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
30e20 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
30e30 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
30e40 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
30e50 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
30e60 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
30e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
30e80 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
30e90 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
30ea0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
30eb0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
30ec0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
30ed0 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
30ee0 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
30ef0 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
30f00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
30f10 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
30f20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
30f30 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
30f40 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
30f50 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
30f60 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
30f70 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
30f80 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
30f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30fa0 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
30fb0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
30fc0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
30fd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
30fe0 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
30ff0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31000 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
31010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31020 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
31030 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
31040 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
31050 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31060 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
31070 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
31080 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
31090 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
310a0 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
310b0 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61  gerGet() until a
310c0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
310d0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
310e0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
310f0 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
31100 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
31110 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
31120 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31130 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
31140 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
31150 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
31160 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
31170 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
31180 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
31190 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
311a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
311b0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
311c0 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
311d0 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
311e0 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
311f0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
31200 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
31210 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
31220 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
31230 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
31240 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
31250 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
31260 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
31270 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
31280 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
31290 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
312a0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
312b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
312c0 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
312d0 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
312e0 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
312f0 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
31300 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
31310 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
31320 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
31330 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
31340 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
31350 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31360 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
31370 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
31380 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
31390 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
313a0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
313b0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
313c0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
313d0 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
313e0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
313f0 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
31400 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
31410 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
31420 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
31430 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
31440 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
31450 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
31460 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
31470 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
31480 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
31490 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
314a0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
314b0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
314c0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
314d0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
314e0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
314f0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
31500 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
31510 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
31520 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
31530 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
31540 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
31550 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
31560 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
31570 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
31580 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
31590 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
315a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
315b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
315c0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
315d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
315e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31600 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
31610 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
31620 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
31630 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
31640 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
31650 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
31660 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
31670 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
31680 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
31690 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
316a0 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
316b0 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
316c0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
316d0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
316e0 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
316f0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
31700 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73   mode.  */.  ass
31710 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
31720 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
31730 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
31740 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
31750 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
31760 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
31770 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
31780 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
31790 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
317a0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
317b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
317c0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
317d0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
317e0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
317f0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
31800 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31810 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
31820 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
31830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31840 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
31850 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
31860 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
31870 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
31880 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31890 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
318a0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
318b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
318c0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
318d0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
318e0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
318f0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
31900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31910 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31920 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
31930 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
31940 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
31950 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
31960 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
31970 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
31980 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
31990 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
319a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
319b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
319c0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
319d0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
319e0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
319f0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
31a00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
31a10 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
31a20 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
31a30 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
31a40 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
31a50 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
31a60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31a80 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31a90 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
31aa0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
31ab0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
31ac0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
31ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
31ae0 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
31af0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
31b00 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
31b10 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
31b20 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
31b30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31b40 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
31b50 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
31b60 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
31b70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
31b80 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
31b90 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
31ba0 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
31bb0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
31bc0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
31bd0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
31be0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31bf0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
31c00 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
31c10 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
31c20 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
31c30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
31c40 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
31c50 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
31c60 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
31c70 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
31c80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
31c90 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
31ca0 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
31cb0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
31cc0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
31cd0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
31ce0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
31cf0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
31d00 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
31d10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31d20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
31d30 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
31d40 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
31d50 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
31d60 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
31d70 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
31d80 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31d90 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
31da0 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
31db0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
31dc0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
31dd0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
31de0 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
31df0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
31e00 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
31e10 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
31e20 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
31e30 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
31e40 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
31e50 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
31e60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31e80 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31e90 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
31ea0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
31eb0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
31ec0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
31ed0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
31ee0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
31ef0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
31f00 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
31f10 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
31f20 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
31f30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
31f40 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
31f50 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
31f60 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
31f70 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
31f80 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
31f90 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
31fa0 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
31fb0 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
31fc0 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
31fd0 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
31fe0 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
31ff0 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
32000 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
32010 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
32020 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
32030 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
32040 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
32050 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
32060 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
32070 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
32080 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
32090 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
320a0 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
320b0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
320c0 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
320d0 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
320e0 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
320f0 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
32100 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
32110 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
32120 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
32130 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
32140 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
32150 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
32160 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
32170 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
32180 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
32190 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
321a0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
321b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
321c0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
321d0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
321e0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
321f0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
32200 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
32210 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
32220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
32230 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
32240 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
32250 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32260 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
32270 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
32280 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32290 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
322a0 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
322b0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
322c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
322d0 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
322e0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
322f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
32300 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
32310 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
32320 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
32330 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
32340 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
32350 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
32360 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32370 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
32380 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
32390 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
323a0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
323b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
323c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
323d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
323e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
323f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32400 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
32410 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
32420 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32430 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
32440 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
32450 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
32460 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
32470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32480 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
32490 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
324a0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
324b0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
324c0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
324d0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
324e0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
324f0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
32500 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
32510 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
32520 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
32530 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
32540 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
32550 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
32560 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
32570 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
32580 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
32590 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
325a0 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
325b0 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
325c0 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
325d0 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
325e0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
325f0 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
32600 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
32610 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
32620 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
32630 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
32640 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
32650 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
32660 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
32670 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32680 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
32690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
326a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
326b0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
326c0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
326d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
326e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
326f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
32700 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
32710 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
32720 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  e);.          pP
32730 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
32740 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
32750 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
32760 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
32770 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
32780 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
32790 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
327a0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
327b0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
327c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
327d0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
327e0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
327f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
32800 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
32810 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
32820 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
32830 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
32840 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
32850 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
32860 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
32870 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
32880 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
32890 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
328a0 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
328b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
328c0 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
328d0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
328e0 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
328f0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
32900 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
32910 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
32920 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
32930 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
32940 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
32950 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
32960 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
32970 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
32980 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
32990 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
329a0 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
329b0 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
329c0 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
329d0 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
329e0 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
329f0 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
32a00 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
32a10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
32a20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
32a30 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
32a40 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
32a50 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
32a60 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
32a70 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
32a80 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
32a90 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
32aa0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
32ab0 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
32ac0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
32ad0 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
32ae0 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
32af0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
32b00 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
32b10 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
32b20 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
32b30 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
32b40 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
32b50 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
32b60 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
32b70 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
32b80 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
32b90 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
32ba0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
32bb0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
32bc0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
32bd0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
32be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
32bf0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32c00 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
32c10 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
32c20 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
32c30 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
32c40 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
32c50 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
32c60 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
32c70 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
32c80 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
32c90 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
32ca0 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
32cb0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32cc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
32cd0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
32ce0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
32cf0 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74  red then check t
32d00 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
32d10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
32d20 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
32d30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
32d40 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a  se has changed,.
32d50 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
32d60 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68  he cache.  The h
32d70 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32d80 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
32d90 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
32da0 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74  * occurring on t
32db0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63  he very first ac
32dc0 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20  cess to a file, 
32dd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65  in order to save
32de0 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
32df0 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  le unnecessary s
32e00 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
32e10 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74  all at the start
32e20 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -up..      **.  
32e30 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
32e40 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65  changes are dete
32e50 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
32e60 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
32e70 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
32e80 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
32e90 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
32ea0 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
32eb0 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
32ec0 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
32ed0 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
32ee0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
32ef0 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
32f00 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
32f10 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
32f20 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
32f30 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
32f40 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
32f50 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
32f60 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
32f70 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
32f80 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
32f90 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
32fa0 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
32fb0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
32fc0 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
32fd0 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
32fe0 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
32ff0 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
33000 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
33010 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
33020 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
33030 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
33040 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
33050 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
33060 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
33070 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
33080 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
33090 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
330a0 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b  c ) goto failed;
330b0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
330c0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
330d0 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
330e0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
330f0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33100 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
33110 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
33120 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
33130 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
33140 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
33150 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
33160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
33170 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
33180 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
33190 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
331a0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
331b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
331c0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
331d0 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
331e0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
331f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
33200 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
33210 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
33220 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
33230 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
33240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
33250 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
33260 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  );..        /* U
33270 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73  nmap the databas
33280 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f  e file. It is po
33290 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65  ssible that exte
332a0 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20  rnal processes. 
332b0 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61         ** may ha
332c0 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65  ve truncated the
332d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
332e0 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64  nd then extended
332f0 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20   it back.       
33300 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69   ** to its origi
33310 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74  nal size while t
33320 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20  his process was 
33330 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  not holding a lo
33340 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
33350 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
33360 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61  e may exist a Pa
33370 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67  ger.pMap mapping
33380 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20   that appears.  
33390 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74        ** to be t
333a0 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75  he right size bu
333b0 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  t is not actuall
333c0 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74  y valid. Avoid t
333d0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
333e0 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e  ossibility by un
333f0 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68  mapping the db h
33400 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
33410 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
33420 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
33430 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
33440 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
33450 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
33460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
33470 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
33480 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20  s a WAL file in 
33490 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
334a0 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62   open this datab
334b0 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a  ase in WAL.    *
334c0 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  * mode. Otherwis
334d0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
334e0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69   function call i
334f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
33500 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
33510 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
33520 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65  (pPager);.#ifnde
33530 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
33540 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  L.    assert( pP
33550 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c  ager->pWal==0 ||
33560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33570 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
33580 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
33590 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
335a0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
335b0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
335c0 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
335d0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
335e0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
335f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
33600 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  =0 && pPager->eS
33610 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
33620 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
33630 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
33640 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
33650 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
33660 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
33670 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
33680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33690 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
336a0 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
336b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
336c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
336d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
336e0 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
336f0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
33700 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
33710 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61  ;.    pPager->ha
33720 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
33730 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
33740 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
33750 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
33760 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
33770 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
33780 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
33790 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
337a0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
337b0 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
337c0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
337d0 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
337e0 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
337f0 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
33800 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
33810 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
33820 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
33830 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
33840 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
33850 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
33860 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
33870 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
33880 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
33890 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
338a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d   if( pPager->nMm
338b0 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c  apOut==0 && (sql
338c0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
338d0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
338e0 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
338f0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
33900 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
33910 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
33920 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68  page getter meth
33930 6f 64 73 20 65 61 63 68 20 74 72 79 20 74 6f 20  ods each try to 
33940 61 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  acquire a refere
33950 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65  nce to a.** page
33960 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
33970 72 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72  r pgno. If the r
33980 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
33990 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
339a0 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
339b0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
339c0 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
339d0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
339e0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
339f0 20 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65   different imple
33a00 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
33a10 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20  e getter method 
33a20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20  depending.** on 
33a30 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
33a40 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  e of the pager..
33a50 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  **.**     getPag
33a60 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20  eNormal()       
33a70 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c    --  The normal
33a80 20 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67   getter.**     g
33a90 65 74 50 61 67 65 45 72 72 6f 72 28 29 20 20 20  etPageError()   
33aa0 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20         --  Used 
33ab0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
33ac0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
33ad0 65 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  e.**     getPage
33ae0 4d 6d 61 70 28 29 20 20 20 20 20 20 20 20 20 20  Mmap()          
33af0 20 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d   --  Used if mem
33b00 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69  ory-mapped I/O i
33b10 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20  s enabled.**.** 
33b20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
33b30 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
33b40 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
33b50 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
33b60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
33b70 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
33b80 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
33b90 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
33ba0 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
33bb0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
33bc0 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
33bd0 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
33be0 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
33bf0 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
33c00 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
33c10 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
33c20 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
33c30 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
33c40 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
33c50 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
33c60 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
33c70 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
33c80 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
33c90 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
33ca0 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
33cb0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
33cc0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
33cd0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
33ce0 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
33cf0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
33d00 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
33d10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
33d20 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
33d30 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
33d40 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
33d50 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
33d60 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
33d70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
33d80 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
33d90 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
33da0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
33db0 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67   if .** the flag
33dc0 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
33dd0 61 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47  ains the PAGER_G
33de0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74  ET_NOCONTENT bit
33df0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
33e00 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
33e10 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
33e20 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
33e30 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
33e40 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
33e50 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
33e60 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
33e70 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
33e80 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
33e90 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
33ea0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f  .**.** If PAGER_
33eb0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
33ec0 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
33ed0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
33ee0 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
33ef0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
33f00 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
33f10 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
33f20 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
33f30 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
33f40 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
33f50 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
33f60 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
33f70 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
33f80 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
33f90 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
33fa0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
33fb0 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
33fc0 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
33fd0 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
33fe0 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
33ff0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
34000 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
34010 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41  nal..**.** If PA
34020 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
34030 54 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  T is true, then 
34040 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
34050 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
34060 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
34070 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
34080 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
34090 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
340a0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
340b0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
340c0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
340d0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
340e0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
340f0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
34100 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
34110 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
34120 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
34130 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
34140 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
34150 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
34160 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
34170 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
34180 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
34190 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
341a0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
341b0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
341c0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
341d0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
341e0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
341f0 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
34200 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
34210 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
34220 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
34230 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
34240 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
34250 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
34260 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
34270 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
34280 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
34290 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
342a0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
342b0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
342c0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
342d0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
342e0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
342f0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
34300 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
34310 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
34320 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
34330 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
34340 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
34350 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
34360 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
34370 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
34380 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
34390 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
343a0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
343b0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
343c0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
343d0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
343e0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
343f0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
34400 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
34410 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
34420 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
34430 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
34440 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
34450 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
34460 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67  ageNormal(.  Pag
34470 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
34480 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
34490 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
344a0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
344b0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
344c0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
344d0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
344e0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
344f0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
34500 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
34510 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
34520 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
34530 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
34540 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
34550 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34560 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
34570 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20    u8 noContent; 
34580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34590 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47    /* True if PAG
345a0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
345b0 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c   is set */.  sql
345c0 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
345d0 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65   *pBase;..  asse
345e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
345f0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
34600 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34610 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
34620 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
34630 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
34640 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
34650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34660 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
34670 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20  redLock==1 );.. 
34680 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72   if( pgno==0 ) r
34690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
346a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61  RUPT_BKPT;.  pBa
346b0 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
346c0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
346d0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
346e0 29 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d  );.  if( pBase==
346f0 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  0 ){.    pPg = 0
34700 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
34710 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72  e3PcacheFetchStr
34720 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ess(pPager->pPCa
34730 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73  che, pgno, &pBas
34740 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
34750 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34760 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34770 72 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73  rr;.    if( pBas
34780 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
34790 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
347a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
347b0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
347c0 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rr;.    }.  }.  
347d0 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
347e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
347f0 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
34800 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34810 70 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74  pBase);.  assert
34820 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29  ( pPg==(*ppPage)
34830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34840 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  g->pgno==pgno );
34850 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
34860 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
34870 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30  | pPg->pPager==0
34880 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74   );..  noContent
34890 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
348a0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
348b0 21 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  !=0;.  if( pPg->
348c0 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
348d0 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
348e0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
348f0 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
34900 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
34910 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
34920 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
34930 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
34940 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
34950 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
34960 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
34970 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
34980 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34990 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
349a0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
349b0 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75  HIT]++;.    retu
349c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
349d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
349e0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
349f0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
34a00 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
34a10 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
34a20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
34a30 65 64 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f  ed. But first so
34a40 6d 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a  me error checks:
34a50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
34a60 31 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  1) The maximum p
34a70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
34a80 33 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65  31.    ** (2) Ne
34a90 76 65 72 20 74 72 79 20 74 6f 20 66 65 74 63 68  ver try to fetch
34aa0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
34ab0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
34ac0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
34ad0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
34ae0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
34af0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
34b00 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
34b10 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
34b20 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34b30 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34b40 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
34b50 61 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  ager;..    asser
34b60 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
34b70 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42  r->fd) || !MEMDB
34b80 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f   );.    if( !isO
34b90 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
34ba0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
34bb0 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
34bc0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
34bd0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
34be0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
34bf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
34c00 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
34c10 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34c30 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
34c40 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
34c50 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
34c60 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
34c70 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
34c80 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
34c90 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
34ca0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
34cb0 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
34cc0 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
34cd0 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
34ce0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
34cf0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
34d00 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
34d10 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
34d20 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
34d30 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
34d40 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
34d50 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
34d60 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
34d70 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
34d80 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
34d90 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34da0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
34db0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
34dc0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
34dd0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
34de0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
34df0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
34e00 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
34e10 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
34e20 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
34e30 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
34e40 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
34e50 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
34e60 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
34e70 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
34e80 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
34e90 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
34ea0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
34eb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34ec0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
34ed0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
34ee0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
34ef0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
34f00 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
34f10 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
34f20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
34f30 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
34f40 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
34f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33   }else{.      u3
34f60 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
34f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34f80 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
34f90 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
34fa0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
34fb0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
34fc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34fd0 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
34fe0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
34ff0 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
35000 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35010 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
35020 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35030 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
35040 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
35050 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
35060 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
35070 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
35080 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72  MISS]++;.      r
35090 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
350a0 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
350b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
350c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
350d0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
350e0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
350f0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
35100 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
35110 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
35120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
35130 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
35140 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
35150 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
35160 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
35170 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
35180 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
35190 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
351a0 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  ger);.  *ppPage 
351b0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
351c0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
351d0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
351e0 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
351f0 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f  er for when memo
35200 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
35210 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
35220 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d  ic int getPageMM
35230 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ap(.  Pager *pPa
35240 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
35250 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
35260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35270 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
35280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
35290 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
352a0 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
352b0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
352c0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
352d0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
352e0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
352f0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
35300 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
35310 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
35320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
35330 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
35340 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
35350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35360 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
35370 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
35380 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
35390 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
353a0 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
353b0 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
353c0 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
353d0 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
353e0 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
353f0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
35400 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
35410 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
35420 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
35430 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
35440 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
35450 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
35460 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
35470 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
35480 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
35490 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
354a0 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67 65  o>1.   && (pPage
354b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
354c0 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
354d0 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45  s & PAGER_GET_RE
354e0 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20  ADONLY)).  );.. 
354f0 20 61 73 73 65 72 74 28 20 55 53 45 46 45 54 43   assert( USEFETC
35500 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66  H(pPager) );.#if
35510 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
35520 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28 20 70  ODEC.  assert( p
35530 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
35540 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
35550 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
35560 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
35570 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
35580 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
35590 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
355a0 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
355b0 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
355c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
355d0 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
355e0 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
355f0 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
35600 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
35610 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
35620 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
35630 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
35640 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
35650 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
35660 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
35670 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
35680 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
35690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
356a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
356b0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
356c0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
356d0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
356e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
356f0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
35700 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
35710 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35720 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
35730 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26  .  if( bMmapOk &
35740 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
35750 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
35760 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
35770 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
35780 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
35790 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
357a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
357b0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
357c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
357d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
357e0 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
357f0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69  me==0 ){.    voi
35800 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  d *pData = 0;.  
35810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
35820 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
35830 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36 34 29  , .        (i64)
35840 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
35850 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
35860 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
35870 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20  pData.    );.   
35880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35890 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
358a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
358b0 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45  >eState>PAGER_RE
358c0 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ADER || pPager->
358d0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
358e0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
358f0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
35900 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
35910 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
35920 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
35930 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
35940 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c  eMapPage(pPager,
35950 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70   pgno, pData, &p
35960 50 67 29 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b  Pg);.     }else{
35970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35980 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
35990 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
359a0 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
359b0 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
359c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
359d0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61  pPg ){.        a
359e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
359f0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
35a00 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
35a10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
35a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
35a30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
35a40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35a50 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
35a60 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
35a70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
35a80 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e 6f  return getPageNo
35a90 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67 6e  rmal(pPager, pgn
35aa0 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
35ab0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
35ac0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
35ad0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65  IZE>0 */../* The
35ae0 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74   page getter met
35af0 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65  hod for when the
35b00 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72 72   pager is an err
35b10 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61 74  or state */.stat
35b20 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72  ic int getPageEr
35b30 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ror(.  Pager *pP
35b40 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
35b50 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
35b60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35b70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
35b80 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
35b90 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
35ba0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
35bb0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
35bc0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
35bd0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
35be0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
35bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
35c00 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
35c10 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
35c20 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a  ARAMETER(pgno);.
35c30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35c40 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73 73  ER(flags);.  ass
35c50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
35c60 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
35c70 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
35c80 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
35c90 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a  r->errCode;.}...
35ca0 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c 20  /* Dispatch all 
35cb0 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75 65  page fetch reque
35cc0 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72 6f  sts to the appro
35cd0 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d 65  priate getter me
35ce0 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  thod..*/.int sql
35cf0 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
35d00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
35d10 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
35d20 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
35d30 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
35d40 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
35d50 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
35d60 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
35d70 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
35d80 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
35d90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
35da0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
35db0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
35dc0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
35dd0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
35de0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
35df0 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  xGet(pPager, pgn
35e00 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
35e10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  );.}../*.** Acqu
35e20 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
35e30 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
35e40 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
35e50 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
35e60 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
35e70 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
35e80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35e90 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
35ea0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
35eb0 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
35ec0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
35ed0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
35ee0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
35ef0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
35f00 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
35f10 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
35f20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
35f30 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
35f40 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
35f50 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
35f60 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
35f70 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
35f80 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
35f90 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
35fa0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
35fb0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
35fc0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
35fd0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
35fe0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
35ff0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
36000 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
36010 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
36020 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
36030 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
36040 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
36050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
36060 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
36070 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
36080 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  e!=0 );.  pPage 
36090 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
360a0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
360b0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  ache, pgno, 0);.
360c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d    assert( pPage=
360d0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61  =0 || pPager->ha
360e0 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
360f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  );.  if( pPage==
36100 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
36110 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
36120 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
36130 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
36140 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d   pgno, pPage);.}
36150 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
36160 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
36170 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
36180 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
36190 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
361a0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
361b0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
361c0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
361d0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
361e0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
361f0 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
36200 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
36210 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
36220 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
36230 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
36240 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
36250 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
36260 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67  refNotNull(DbPag
36270 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
36280 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65   *pPager;.  asse
36290 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20  rt( pPg!=0 );.  
362a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
362b0 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
362c0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
362d0 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MAP ){.    pager
362e0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70  ReleaseMapPage(p
362f0 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
36300 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
36310 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
36320 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
36330 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
36340 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  }.void sqlite3Pa
36350 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
36360 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
36370 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55   ) sqlite3PagerU
36380 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
36390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
363a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
363b0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
363c0 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
363d0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
363e0 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
363f0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
36400 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
36410 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36420 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
36430 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
36440 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
36450 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
36460 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
36470 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
36480 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
36490 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
364a0 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
364b0 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
364c0 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
364d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
364e0 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
364f0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
36500 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
36510 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
36520 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
36530 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
36540 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
36550 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
36560 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
36570 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
36580 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
36590 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
365a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
365b0 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
365c0 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
365d0 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
365e0 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
365f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
36600 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
36610 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
36620 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
36630 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
36640 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
36650 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
36660 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
36670 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
36680 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
36690 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
366a0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
366b0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
366c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
366d0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
366e0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
366f0 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
36700 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
36710 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
36720 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
36730 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
36740 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
36750 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
36760 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
36770 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
36780 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
36790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
367a0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
367b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
367c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
367d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
367e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
367f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
36800 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
36810 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
36820 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c  er->pVfs;   /* L
36830 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66  ocal cache of vf
36840 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20  s pointer */..  
36850 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36860 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36870 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
36880 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36890 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
368a0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
368b0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
368c0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
368d0 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
368e0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
368f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
36900 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
36910 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  on.  ** the othe
36920 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75  r hand, this rou
36930 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
36940 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61  lled if we are a
36950 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61  lready in.  ** a
36960 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  n error state. *
36970 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
36980 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
36990 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
369a0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20  errCode;..  if( 
369b0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
369c0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
369d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
369e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
369f0 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  FF ){.    pPager
36a00 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
36a10 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
36a20 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
36a30 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
36a40 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
36a50 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
36a60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
36a70 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  KPT;.    }.  .  
36a80 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
36a90 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
36aa0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
36ab0 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
36ac0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
36ad0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
36ae0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
36af0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
36b00 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
36b10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36b20 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
36b30 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
36b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36b50 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
36b60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
36b70 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
36b80 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
36b90 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a     int nSpill;..
36ba0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
36bb0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
36bc0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
36bd0 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |= (SQLITE_OPEN_
36be0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
36bf0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
36c00 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
36c10 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69     nSpill = sqli
36c20 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53  te3Config.nStmtS
36c30 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  pill;.        }e
36c40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
36c50 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
36c60 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
36c70 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69  ;.          nSpi
36c80 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53  ll = jrnlBufferS
36c90 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
36ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36cb0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72   .        /* Ver
36cc0 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
36cd0 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20  abase still has 
36ce0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
36cf0 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20   it did when.   
36d00 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f       ** it was o
36d10 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
36d20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
36d30 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  = databaseIsUnmo
36d40 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ved(pPager);.   
36d50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36d70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36d80 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20  JournalOpen (.  
36d90 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
36da0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
36db0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
36dc0 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20   flags, nSpill. 
36dd0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
36de0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36df0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
36e00 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
36e10 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
36e20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
36e30 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
36e40 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
36e50 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
36e60 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
36e70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
36e80 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
36e90 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
36ea0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
36ec0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
36ed0 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
36ee0 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
36ef0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
36f00 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
36f10 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
36f20 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
36f30 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
36f40 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
36f50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
36f60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
36f70 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
36f80 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
36f90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
36fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36fb0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
36fc0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
36fd0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
36fe0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36ff0 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
37000 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
37010 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37020 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37030 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
37040 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
37050 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
37060 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
37070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
37080 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
37090 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
370a0 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
370b0 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
370c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
370d0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
370e0 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
370f0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
37100 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
37110 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
37120 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
37130 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
37140 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
37150 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
37160 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
37170 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
37180 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
37190 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
371a0 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
371b0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
371c0 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
371d0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
371e0 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
371f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
37200 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
37210 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
37220 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
37230 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
37240 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
37250 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
37260 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
37270 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
37280 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
37290 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
372a0 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
372b0 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
372c0 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
372d0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
372e0 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
372f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
37300 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
37310 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
37320 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
37330 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
37340 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
37350 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
37360 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
37370 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
37380 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
37390 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
373a0 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
373b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
373c0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
373d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
373e0 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
373f0 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
37400 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
37410 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
37420 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
37430 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
37440 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
37450 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
37460 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37470 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
37480 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
37490 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
374a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
374b0 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
374c0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
374d0 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
374e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
374f0 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
37500 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37510 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
37520 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
37530 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
37540 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
37550 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
37560 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
37570 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
37580 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
37590 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
375a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
375b0 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
375c0 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
375d0 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
375e0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
375f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
37600 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
37610 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
37620 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
37630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
37640 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
37650 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
37660 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37680 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
37690 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
376a0 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
376b0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
376c0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
376d0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
376e0 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
376f0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
37700 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
37710 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
37720 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
37730 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
37740 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
37750 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
37760 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
37770 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
37780 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
37790 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
377a0 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
377b0 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
377c0 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
377d0 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
377e0 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
377f0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
37800 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
37810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37820 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
37830 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
37840 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
37850 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
37860 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
37870 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
37880 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
37890 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
378a0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
378b0 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
378c0 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
378d0 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
378e0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
378f0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
37900 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
37910 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
37920 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
37930 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
37940 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
37950 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
37960 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
37970 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37980 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
37990 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
379a0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
379b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
379c0 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   && exFlag ){.  
379d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
379e0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
379f0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
37a00 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
37a10 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
37a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37a30 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
37a40 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
37a50 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
37a60 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
37a70 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
37a80 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
37a90 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
37aa0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
37ab0 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
37ac0 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
37ad0 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
37ae0 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
37af0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
37b00 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
37b10 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
37b20 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
37b30 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
37b40 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
37b50 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
37b60 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
37b70 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
37b80 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
37b90 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
37ba0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
37bb0 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
37bc0 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
37bd0 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
37be0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
37bf0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
37c00 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
37c10 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
37c20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
37c30 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
37c40 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
37c50 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
37c60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
37c70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
37c80 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
37c90 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
37ca0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37cb0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
37cc0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
37cd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
37ce0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37cf0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
37d00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
37d10 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
37d20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37d30 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
37d40 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
37d50 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
37d60 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
37d70 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
37d80 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
37d90 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
37da0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
37db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
37dc0 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74   page pPg onto t
37dd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f  he end of the ro
37de0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
37df0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
37e00 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61  _NOINLINE int pa
37e10 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
37e20 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64  backJournal(PgHd
37e30 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
37e40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
37e50 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
37e60 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
37e70 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
37e80 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
37e90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
37ea0 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20  .  /* We should 
37eb0 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
37ec0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37ed0 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
37ee0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
37ef0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
37f00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
37f10 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
37f20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
37f30 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ot. */.  assert(
37f40 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
37f50 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
37f60 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
37f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
37f80 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
37f90 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45  nalOff );.  CODE
37fa0 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C2(pPager, pPg->
37fb0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
37fc0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
37fd0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
37fe0 44 61 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20  Data2);.  cksum 
37ff0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
38000 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
38010 32 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69  2);..  /* Even i
38020 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
38030 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ull error occurs
38040 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
38050 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  ng the.  ** page
38060 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
38070 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
38080 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
38090 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f  the page..  ** O
380a0 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
380b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
380c0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
380d0 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a  he logic in.  **
380e0 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
380f0 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
38100 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
38110 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
38120 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64  ed.  ** in the d
38130 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
38140 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
38150 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
38160 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65  ing so,.  ** the
38170 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
38180 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20   follow..  */.  
38190 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
381a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
381b0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
381c0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
381d0 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  iOff, pPg->pgno)
381e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
381f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
38200 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
38210 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
38220 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
38230 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
38240 69 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72  iOff+4);.  if( r
38250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
38260 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
38270 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
38280 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
38290 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
382a0 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  4, cksum);.  if(
382b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
382c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49   return rc;..  I
382d0 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
382e0 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
382f0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
38300 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  o, .           p
38310 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
38320 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
38330 69 7a 65 29 29 3b 0a 20 20 50 41 47 45 52 5f 49  ize));.  PAGER_I
38340 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
38350 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
38360 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
38370 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
38380 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
38390 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
383a0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
383b0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
383c0 20 0a 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e   .       ((pPg->
383d0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
383e0 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
383f0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
38400 29 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ));..  pPager->j
38410 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
38420 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
38430 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  e;.  pPager->nRe
38440 63 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  c++;.  assert( p
38450 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
38460 6c 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  l!=0 );.  rc = s
38470 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
38480 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
38490 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
384a0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
384b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
384c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
384d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
384e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
384f0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
38500 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
38510 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
38520 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
38530 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
38540 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
38550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
38560 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
38570 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
38580 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
38590 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
385a0 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
385b0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
385c0 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
385d0 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
385e0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
385f0 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
38600 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
38610 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
38620 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
38630 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
38640 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
38650 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
38660 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
38670 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
38680 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
38690 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
386a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
386b0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
386c0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
386d0 70 50 61 67 65 72 20 3d 20 70