/ Hex Artifact Content
Login

Artifact 495c5344392d5932ea5072f20bfbd8a58cf19d67:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 65 64 2c 20 61 6c 6c 20 74 68 61  occured, all tha
3090: 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20  t remains is to 
30a0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
30b0: 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20  rnal to.**      
30c0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
30d0: 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  action. If an er
30e0: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ror did occur, t
30f0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e  he caller will n
3100: 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72  eed.**      to r
3110: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
3120: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
3130: 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20   ERROR:.**.**   
3140: 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
3150: 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e   is entered when
3160: 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66   an IO or disk-f
3170: 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75  ull error (inclu
3180: 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54  ding.**    SQLIT
3190: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f  E_IOERR_NOMEM) o
31a0: 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74  ccurs at a point
31b0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61   in the code tha
31c0: 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20  t makes it .**  
31d0: 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62    difficult to b
31e0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
31f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
3200: 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e  state (cache con
3210: 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62  tents, .**    db
3220: 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20   size etc.) are 
3230: 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
3240: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3250: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
3260: 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72  .**.**    Tempor
3270: 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 20  ary pager files 
3280: 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45 52  may enter the ER
3290: 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 69  ROR state, but i
32a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a  n-memory pagers.
32b0: 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a  **    cannot..**
32c0: 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  .**    For examp
32d0: 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72  le, if an IO err
32e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
32f0: 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c  performing a rol
3300: 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68  lback, .**    th
3310: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3320: 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79  e page-cache may
3330: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
3340: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74  nconsistent stat
3350: 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73  e..**    At this
3360: 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
3370: 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20  be dangerous to 
3380: 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52  change back to R
3390: 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20  EADER state.**  
33a0: 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61    (as usually ha
33b0: 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f  ppens after a ro
33c0: 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62  llback). Any sub
33d0: 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73 20  sequent readers 
33e0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f  might.**    repo
33f0: 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  rt database corr
3400: 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74  uption (due to t
3410: 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  he inconsistent 
3420: 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a  cache), and if.*
3430: 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61 64  *    they upgrad
3440: 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68  e to writers, th
3450: 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65  ey may inadverte
3460: 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  ntly corrupt the
3470: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
3480: 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74  file. To avoid t
3490: 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20  his hazard, the 
34a0: 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20 69  pager switches i
34b0: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
34c0: 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61  ate.**    instea
34d0: 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c  d of READER foll
34e0: 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72  owing such an er
34f0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e  ror..**.**    On
3500: 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72 65  ce it has entere
3510: 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
3520: 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  e, any attempt t
3530: 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72 0a  o use the pager.
3540: 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72  **    to read or
3550: 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74 75   write data retu
3560: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76  rns an error. Ev
3570: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61  entually, once a
3580: 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61  ll .**    outsta
3590: 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  nding transactio
35a0: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62 61  ns have been aba
35b0: 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65  ndoned, the page
35c0: 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  r is able to.** 
35d0: 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61     transition ba
35e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
35f0: 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68 65  , discarding the
3600: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3610: 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63   .**    page-cac
3620: 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  he and any other
3630: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65   in-memory state
3640: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3650: 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a  e. Everything.**
3660: 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20      is reloaded 
3670: 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20  from disk (and, 
3680: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f  if necessary, ho
3690: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
36a0: 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20  ck peformed).** 
36b0: 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74     when a read-t
36c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
36d0: 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  xt opened on the
36e0: 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74 69   pager (transiti
36f0: 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20  oning.**    the 
3700: 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45  pager into READE
3710: 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68 61  R state). At tha
3720: 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74  t point the syst
3730: 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65 64  em has recovered
3740: 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65   .**    from the
3750: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   error..**.**   
3760: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
3770: 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69  he pager jumps i
3780: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
3790: 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ate if:.**.**   
37a0: 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f     1. An error o
37b0: 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74 65  ccurs while atte
37c0: 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  mpting a rollbac
37d0: 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  k. This happens 
37e0: 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75  in.**         fu
37f0: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3800: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a  gerRollback()..*
3810: 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20  *.**      2. An 
3820: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
3830: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
3840: 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72   finalize a jour
3850: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
3860: 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20      following a 
3870: 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69  commit in functi
3880: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  on sqlite3PagerC
3890: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e  ommitPhaseTwo().
38a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41  .**.**      3. A
38b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
38c0: 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20  hile attempting 
38d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
38e0: 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20  journal or.**   
38f0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
3900: 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ile in function 
3910: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
3920: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
3930: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d  p.**         mem
3940: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e  ory..**.**    In
3950: 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74 68   other cases, th
3960: 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  e error is retur
3970: 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65  ned to the b-tre
3980: 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74  e layer. The b-t
3990: 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20  ree.**    layer 
39a0: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20  then attempts a 
39b0: 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
39c0: 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
39d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20   condition .**  
39e0: 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65 20    persists, the 
39f0: 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
3a00: 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69 61   ERROR state via
3a10: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61   condition (1) a
3a20: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43  bove..**.**    C
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20  ondition (3) is 
3a40: 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
3a50: 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69 67  e it can be trig
3a60: 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64 2d  gered by a read-
3a70: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65  only.**    state
3a80: 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77 69  ment executed wi
3a90: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
3aa0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
3ab0: 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a  , if the error.*
3ac0: 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20 73  *    code were s
3ad0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74  imply returned t
3ae0: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
3af0: 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75  b-tree layer wou
3b00: 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74  ld not.**    aut
3b10: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d  omatically attem
3b20: 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  pt a rollback, a
3b30: 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  s it assumes tha
3b40: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a  t an error in a.
3b50: 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20  **    read-only 
3b60: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
3b70: 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65 72   leave the pager
3b80: 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c   in an internall
3b90: 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a  y inconsistent .
3ba0: 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a  **    state..**.
3bb0: 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67 65  **    * The Page
3bc0: 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
3bd0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d  le is set to som
3be0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
3bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
3c00: 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f     * There are o
3c10: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
3c20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
3c30: 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74 65  s to pages (afte
3c40: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61  r the.**      la
3c50: 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  st reference is 
3c60: 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67 65  dropped the page
3c70: 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61  r should move ba
3c80: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
3c90: 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70  )..**    * The p
3ca0: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69  ager is not an i
3cb0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
3cc0: 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  **    .**.** Not
3cd0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20  es:.**.**   * A 
3ce0: 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69  pager is never i
3cf0: 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f  n WRITER_DBMOD o
3d00: 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  r WRITER_FINISHE
3d10: 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a  D state if the.*
3d20: 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e  *     connection
3d30: 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20   is open in WAL 
3d40: 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e  mode. A WAL conn
3d50: 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ection is always
3d60: 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f   in one.**     o
3d70: 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72  f the first four
3d80: 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   states..**.**  
3d90: 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63   * Normally, a c
3da0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69  onnection open i
3db0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
3dc0: 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47   is never in PAG
3dd0: 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73  ER_OPEN.**     s
3de0: 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20  tate. There are 
3df0: 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20  two exceptions: 
3e00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3e10: 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  r exclusive-mode
3e20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
3e30: 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20   turned on (and 
3e40: 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20  before any read 
3e50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3e60: 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20  tions are .**   
3e70: 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64    executed), and
3e80: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
3e90: 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22  is leaving the "
3ea0: 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a  error state"..**
3eb0: 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f  .**   * See also
3ec0: 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  : assert_pager_s
3ed0: 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  tate()..*/.#defi
3ee0: 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20  ne PAGER_OPEN   
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
3f10: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
3f20: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50       1.#define P
3f30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
3f40: 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65  ED         2.#de
3f50: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3f60: 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20  R_CACHEMOD      
3f70: 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   3.#define PAGER
3f80: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
3f90: 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
3fa0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49   PAGER_WRITER_FI
3fb0: 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23  NISHED       5.#
3fc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
3fd0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
3fe0: 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20     6../*.** The 
3ff0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
4000: 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61  able is almost a
4010: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65  lways set to one
4020: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
4030: 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74  owing locking-st
4040: 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20  ates, according 
4050: 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72  to the lock curr
4060: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a  ently held on.**
4070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4080: 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41  le: NO_LOCK, SHA
4090: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
40a0: 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55  ED_LOCK or EXCLU
40b0: 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68  SIVE_LOCK..** Th
40c0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b  is variable is k
40d0: 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61  ept up to date a
40e0: 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65  s locks are take
40f0: 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62  n and released b
4100: 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f  y.** the pagerLo
4110: 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72  ckDb() and pager
4120: 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70  UnlockDb() wrapp
4130: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
4140: 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72  e VFS xLock() or
4150: 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72   xUnlock() retur
4160: 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65  ns an error othe
4170: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
4180: 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20  SY.** (i.e. one 
4190: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
41a0: 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69  ERR subtypes), i
41b0: 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  t is not clear w
41c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
41d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77   the operation w
41e0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49  as successful. I
41f0: 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74  n these circumst
4200: 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44  ances pagerLockD
4210: 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72  b() and.** pager
4220: 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20  UnlockDb() take 
4230: 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61  a conservative a
4240: 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20  pproach - eLock 
4250: 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65  is always update
4260: 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  d.** when unlock
4270: 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e  ing the file, an
4280: 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77  d only updated w
4290: 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  hen locking the 
42a0: 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56  file if the.** V
42b0: 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65  FS call is succe
42c0: 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c  ssful. This way,
42d0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
42e0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65   variable may be
42f0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73   set.** to a les
4300: 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77  s exclusive (low
4310: 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74  er) value than t
4320: 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20  he lock that is 
4330: 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a  actually held.**
4340: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
4350: 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20  evel, but it is 
4360: 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d  never set to a m
4370: 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61  ore exclusive va
4380: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
4390: 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e  is usually safe.
43a0: 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66   If an xUnlock f
43b0: 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20  ails or appears 
43c0: 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d  to fail, there m
43d0: 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20  ay .** be a few 
43e0: 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28  redundant xLock(
43f0: 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63  ) calls or a loc
4400: 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f  k may be held fo
4410: 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a  r longer than.**
4420: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e   required, but n
4430: 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f  othing really go
4440: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4450: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
4460: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
4470: 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  se file is unloc
4480: 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72  ked as the pager
4490: 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45   moves.** from E
44a0: 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61  RROR to OPEN sta
44b0: 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  te. At this poin
44c0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  t there may be a
44d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
44e0: 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c  e .** in the fil
44f0: 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65  e-system that ne
4500: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
4510: 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f   back (as part o
4520: 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44  f a OPEN->SHARED
4530: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20  .** transition, 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  by the same page
4550: 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e  r or any other).
4560: 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
4570: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69  xUnlock().** fai
4580: 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ls at this point
4590: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
45a0: 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61  s left holding a
45b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
45c0: 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f  , this.** can co
45d0: 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  nfuse the call t
45e0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
45f0: 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65  Lock() call made
4600: 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a   later as part.*
4610: 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  * of hot-journal
4620: 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a   detection..**.*
4630: 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
4640: 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65  Lock() is define
4650: 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74  d as returning t
4660: 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73  rue "if there is
4670: 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20   a RESERVED .** 
4680: 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69  lock held by thi
4690: 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79  s process or any
46a0: 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68   others". So xCh
46b0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
46c0: 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74  may .** return t
46d0: 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
46e0: 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73  caller itself is
46f0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
4700: 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a  USIVE lock (but.
4710: 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20  ** doesn't know 
4720: 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  it because of a 
4730: 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69  previous error i
4740: 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74  n xUnlock). If t
4750: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61  his happens.** a
4760: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot-journal may
4770: 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72   be mistaken for
4780: 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67   a journal being
4790: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61   created by an a
47a0: 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
47b0: 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  tion in another 
47c0: 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67  process, causing
47d0: 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20   SQLite to read 
47e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
47f0: 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c  e.** without rol
4800: 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  ling it back..**
4810: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4820: 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61  nd this, if a ca
4830: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20  ll to xUnlock() 
4840: 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63  fails when unloc
4850: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61  king the.** data
4860: 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f  base in the ERRO
4870: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
4880: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
4890: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a  NKNOWN_LOCK. It.
48a0: 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  ** is only chang
48b0: 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61  ed back to a rea
48c0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  l locking state 
48d0: 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
48e0: 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c  ul call.** to xL
48f0: 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20  ock(EXCLUSIVE). 
4900: 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74  Also, the code t
4910: 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53  o do the OPEN->S
4920: 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e  HARED state tran
4930: 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20  sition.** omits 
4940: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20  the check for a 
4950: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50  hot-journal if P
4960: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
4970: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4980: 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74  K .** lock. Inst
4990: 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20  ead, it assumes 
49a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78  a hot-journal ex
49b0: 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73  ists and obtains
49c0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   an EXCLUSIVE.**
49d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
49e0: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
49f0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
4a00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65  roll it back. Se
4a10: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61  e function.** Pa
4a20: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
4a30: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e  for more detail.
4a40: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  .**.** Pager.eLo
4a50: 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73  ck may only be s
4a60: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4a70: 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  CK when the page
4a80: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45  r is in .** PAGE
4a90: 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f  R_OPEN state..*/
4aa0: 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e  .#define UNKNOWN
4ab0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20  _LOCK           
4ac0: 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f       (EXCLUSIVE_
4ad0: 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41  LOCK+1)../*.** A
4ae0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
4af0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
4b00: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
4b10: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
4b20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
4b30: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
4b40: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
4b50: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
4b60: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
4b70: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
4b80: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
4b90: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
4ba0: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
4bb0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
4bc0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
4bd0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
4be0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
4bf0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
4c00: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
4c10: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
4c20: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
4c30: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
4c40: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4c50: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
4c60: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
4c70: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
4c80: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
4c90: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
4ca0: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
4cb0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
4cc0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
4cd0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
4ce0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4cf0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
4d00: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
4d10: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
4d20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
4d30: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
4d40: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
4d50: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
4d60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
4d70: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
4d80: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
4d90: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
4da0: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
4db0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4dd0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4de0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4df0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e00: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e10: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e20: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e30: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e40: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e50: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e60: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4e80: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4e90: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ea0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4eb0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ec0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ed0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4ee0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4ef0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f20: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f30: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f40: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f50: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f60: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f70: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4f80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4f90: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fa0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fb0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fc0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4fd0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
4fe0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
4ff0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5000: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5010: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5020: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5030: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5040: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5050: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5060: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5070: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5080: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50b0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50c0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50d0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
50e0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
50f0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5100: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5110: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5120: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5130: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5140: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5160: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5170: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
5180: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51b0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
51e0: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
51f0: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5200: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5210: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5220: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5230: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
5240: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
5250: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73  an instance of s
5260: 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64  truct Pager. A d
5270: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
5280: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72   some of the mor
5290: 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62  e important memb
52a0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c  er variables fol
52b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61  lows:.**.** eSta
52c0: 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63  te.**.**   The c
52d0: 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f  urrent 'state' o
52e0: 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
52f0: 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ct. See the comm
5300: 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a  ent and state.**
5310: 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65     diagram above
5320: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
5330: 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  on of the pager 
5340: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f  state..**.** eLo
5350: 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61  ck.**.**   For a
5360: 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61   real on-disk da
5370: 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72  tabase, the curr
5380: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
5390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
53a0: 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  le -.**   NO_LOC
53b0: 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
53c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
53d0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
53e0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74  .**.**   For a t
53f0: 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
5400: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
5410: 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
5420: 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20   require any.** 
5430: 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76    locks), this v
5440: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79  ariable is alway
5450: 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49  s set to EXCLUSI
5460: 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73  VE_LOCK. Since s
5470: 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73  uch.**   databas
5480: 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50  es always have P
5490: 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f  ager.exclusiveMo
54a0: 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63  de==1, this tric
54b0: 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  ks the pager.** 
54c0: 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69    logic into thi
54d0: 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c  nking that it al
54e0: 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68  ready has all th
54f0: 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20  e locks it will 
5500: 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28  ever.**   need (
5510: 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f  and no reason to
5520: 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a   release them)..
5530: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20  **.**   In some 
5540: 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d  (obscure) circum
5550: 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61  stances, this va
5560: 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20  riable may also 
5570: 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55  be set to.**   U
5580: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
5590: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
55a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
55b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
55c0: 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e  or.**   details.
55d0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
55e0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
55f0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
5600: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
5610: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5620: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5630: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
5640: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
5650: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
5660: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
5670: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
5680: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
5690: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
56a0: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
56b0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
56c0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
56d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
56e0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
56f0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
5700: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
5710: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
5720: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
5730: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5740: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
5750: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
5760: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
5770: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
5780: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
5790: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
57a0: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
57b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
57c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
57d0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
57e0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
57f0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
5800: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
5810: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
5820: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5830: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
5840: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
5850: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
5860: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
5870: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
5880: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
5890: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
58a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
58b0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
58c0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
58d0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
58e0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
58f0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
5900: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61  ted..**.** setMa
5910: 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ster.**.**   Whe
5920: 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  n PagerCommitPha
5930: 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65  seOne() is calle
5940: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  d to commit a tr
5950: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
5960: 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e  y.**   (or may n
5970: 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61  ot) specify a ma
5980: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
5990: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
59a0: 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a  into the .**   j
59b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
59c0: 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  re it is synced 
59d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20  to disk..**.**  
59e0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
59f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  a journal file c
5a00: 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72  ontains a master
5a10: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5a20: 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74   affects .**   t
5a30: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
5a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a50: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66   is finalized af
5a60: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
5a70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d  ion is .**   com
5a80: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
5a90: 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69   back when runni
5aa0: 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ng in "journal_m
5ab0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64  ode=PERSIST" mod
5ac0: 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75  e..**   If a jou
5ad0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
5ae0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  ot contain a mas
5af0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b00: 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20  ter, it is.**   
5b10: 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65  finalized by ove
5b20: 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72  rwriting the fir
5b30: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
5b40: 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49  r with zeroes. I
5b50: 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63  f.**   it does c
5b60: 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d  ontain a master-
5b70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b90: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a   is finalized .*
5ba0: 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e  *   by truncatin
5bb0: 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  g it to zero byt
5bc0: 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74  es, just as if t
5bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65  he connection we
5be0: 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67  re .**   running
5bf0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5c00: 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65  e=truncate" mode
5c10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61  ..**.**   Journa
5c20: 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e  l files that con
5c30: 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72  tain master jour
5c40: 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e  nal pointers can
5c50: 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64  not be finalized
5c60: 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20  .**   simply by 
5c70: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
5c90: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5ca0: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61  , as the.**   ma
5cb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
5cc0: 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72  nter could inter
5cd0: 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f  fere with hot-jo
5ce0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
5cf0: 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65  f any.**   subse
5d00: 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70  quently interrup
5d10: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
5d20: 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20  that reuses the 
5d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5d40: 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69  .**   The flag i
5d50: 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f  s cleared as soo
5d60: 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n as the journal
5d70: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5d80: 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20  ed (either.**   
5d90: 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  by PagerCommitPh
5da0: 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52  aseTwo or PagerR
5db0: 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20  ollback). If an 
5dc0: 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74  IO error prevent
5dd0: 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s the.**   journ
5de0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
5df0: 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ng successfully 
5e00: 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73  finalized, the s
5e10: 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a  etMaster flag.**
5e20: 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e     is cleared an
5e30: 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61  yway (and the pa
5e40: 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f  ger will move to
5e50: 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a   ERROR state)..*
5e60: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
5e70: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
5e80: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77  **.**   These tw
5e90: 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  o boolean variab
5ea0: 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  les control the 
5eb0: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63  behaviour of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70  */..  void *pMap
7c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c80: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
7c90: 65 64 20 70 72 65 66 69 78 20 6f 66 20 64 61 74  ed prefix of dat
7ca0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7cb0: 69 36 34 20 6e 4d 61 70 3b 20 20 20 20 20 20 20  i64 nMap;       
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7cd0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
7ce0: 74 20 70 4d 61 70 20 69 6e 20 62 79 74 65 73 20  t pMap in bytes 
7cf0: 2a 2f 20 0a 20 20 69 36 34 20 6e 4d 61 70 56 61  */ .  i64 nMapVa
7d00: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
7d10: 20 20 2f 2a 20 42 79 74 65 73 20 61 74 20 70 4d    /* Bytes at pM
7d20: 61 70 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76  ap known to be v
7d30: 61 6c 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  alid */.  int nM
7d40: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7d50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d60: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7d70: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7d80: 69 6e 67 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ing */.  PgHdr *
7d90: 70 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  pFree;          
7da0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
7db0: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
7dc0: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
7dd0: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7de0: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7df0: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7e00: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
7e60: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
7e70: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
7e80: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
7e90: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
7ea0: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
7eb0: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
7ec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7ed0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
7ee0: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
7ef0: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
7f00: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7f10: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
7f20: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
7f30: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
7f40: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
7f50: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
7f60: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
7f70: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
7f80: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7fa0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7fb0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
7fc0: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7fe0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
7ff0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
8000: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
8010: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
8020: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
8030: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
8040: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
8050: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8060: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8070: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8080: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8090: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
80a0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
80b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
80c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
80d0: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
80e0: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
80f0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
8100: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
8110: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
8120: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
8130: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
8140: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
8150: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8160: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8170: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8180: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8190: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
81a0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
81b0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
81e0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
81f0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
8200: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
8210: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
8220: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
8230: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
8240: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
8250: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
8260: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8270: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8280: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8290: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
82a0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
82b0: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
82c0: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
82d0: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
82e0: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
82f0: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8300: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
8310: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
8320: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
8330: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8350: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
8360: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8370: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8380: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
83a0: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
83b0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
83c0: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
83d0: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
83f0: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8400: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
8410: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8420: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
8430: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8440: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
8450: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
8460: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8470: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8480: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8490: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
84a0: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
84b0: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
84c0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
84d0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
84e0: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
84f0: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
8500: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
8510: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
8520: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
8530: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
8540: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
8550: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
8560: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8570: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8580: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8590: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
85a0: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
85b0: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
85c0: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
85d0: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
85e0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
85f0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
8600: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
8610: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
8620: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
8630: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
8640: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
8650: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
8660: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8670: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8680: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8690: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
86a0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
86b0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
86c0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
86d0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
86e0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
86f0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8700: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
8710: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
8720: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
8730: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
8740: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8750: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
8760: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8770: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8780: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8790: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
87a0: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
87b0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
87c0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
87d0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
87e0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
87f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8800: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
8810: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
8820: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
8830: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
8840: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
8850: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
8860: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8870: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8880: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8890: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
88a0: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
88b0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
88c0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
88d0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
88e0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
88f0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8900: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
8910: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
8920: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
8930: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
8940: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
8950: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
8960: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8970: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8980: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8990: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
89a0: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
89b0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
89c0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
89d0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
89e0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
89f0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8a00: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
8a10: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
8a20: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
8a30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
8a40: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
8a50: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
8a60: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8a70: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8a80: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8a90: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8aa0: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8ab0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8ac0: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8ad0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8ae0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8af0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8b00: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
8b10: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
8b20: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
8b30: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
8b40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
8b50: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
8b60: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8b70: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8b80: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8b90: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8ba0: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8bb0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8bc0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8bd0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8be0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8bf0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8c00: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8c10: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8c20: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8c30: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8c40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8c50: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8c60: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8c70: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8c80: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8c90: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8ca0: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8cb0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8cc0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8cd0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8ce0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8cf0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8d00: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8d10: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8d20: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8d30: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8d40: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8d50: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8d60: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8d70: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8d80: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8d90: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8da0: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8db0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8dc0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8dd0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8de0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8df0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8e00: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8e10: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8e20: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
8e30: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
8e40: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
8e50: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
8e60: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
8e70: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
8e80: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
8e90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
8ea0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
8eb0: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
8ec0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
8ed0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
8ee0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
8ef0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
8f00: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
8f10: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
8f20: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
8f30: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
8f40: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
8f50: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
8f60: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
8f70: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
8f80: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
8f90: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
8fa0: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
8fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8fc0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
8fd0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
8fe0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
8ff0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
9000: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
9010: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
9020: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
9030: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
9040: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
9050: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
9060: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
9070: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
9080: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
9090: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
90a0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
90b0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
90c0: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
90d0: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
90e0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
90f0: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
9100: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
9110: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
9120: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
9130: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
9140: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
9150: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
9160: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
9170: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
9180: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
9190: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
91a0: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ods)../*.** Retu
91b0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
91c0: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
91d0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
91e0: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
91f0: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9200: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
9210: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
9220: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
9230: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
9240: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
9250: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
9260: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9270: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9280: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9290: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
92a0: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
92b0: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
92c0: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
92d0: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
92e0: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
92f0: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9300: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
9310: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
9320: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
9330: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
9340: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
9350: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
9360: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9370: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9380: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
93a0: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
93b0: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
93c0: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
93d0: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
93e0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
93f0: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9400: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
9410: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
9420: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
9430: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
9440: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
9450: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
9460: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9470: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9480: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9490: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
94a0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
94b0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
94c0: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
94d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
94e0: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
94f0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9500: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9510: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
9520: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9530: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
9540: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
9550: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
9560: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9570: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9580: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9590: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
95a0: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
95b0: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
95c0: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
95d0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
95e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
95f0: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9600: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
9610: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
9620: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
9630: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
9640: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
9650: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9660: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9670: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9680: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9690: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
96a0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
96b0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
96c0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
96d0: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
96e0: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
96f0: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9700: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
9710: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
9720: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
9730: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9740: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
9750: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9760: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9770: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9780: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9790: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
97a0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
97b0: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
97c0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
97d0: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
97e0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
97f0: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9800: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
9810: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9820: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
9830: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
9840: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
9850: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
9860: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9870: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9880: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9890: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
98a0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
98b0: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
98c0: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
98d0: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
98e0: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
98f0: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9900: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
9910: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
9920: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
9930: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
9940: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
9950: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
9960: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9970: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9980: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9990: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
99a0: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
99b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
99c0: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
99d0: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
99e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
99f0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9a00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9a10: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
9a20: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9a30: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9a40: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
9a50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
9a60: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9a70: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9a80: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9a90: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9aa0: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9ab0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9ac0: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9ad0: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9ae0: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9af0: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
9b00: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
9b10: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9b20: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9b30: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
9b40: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
9b50: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
9b60: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
9b70: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
9b80: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
9b90: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
9ba0: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
9bb0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
9bc0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9bd0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9be0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9bf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9c00: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
9c10: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
9c20: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
9c30: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
9c40: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9c50: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
9c60: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
9c70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9c80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9c90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9ca0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9cb0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9cc0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
9cd0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
9ce0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9cf0: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9d00: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
9d10: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9d20: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9d30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9d40: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9d60: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
9d70: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
9d80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9d90: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9da0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9db0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9dc0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9dd0: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9de0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9df0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9e00: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9e10: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9e20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e30: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9e40: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9e50: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9e60: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
9e70: 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Master==0 );.   
9e80: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9e90: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
9ea0: 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20  _CACHEMOD:.     
9eb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9ec0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9ed0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9ee0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9ef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9f00: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9f10: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9f20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69  .        /* It i
9f30: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
9f40: 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
9f50: 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65  wal here that ne
9f60: 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20  ither the.      
9f70: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9f80: 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69  e nor the WAL fi
9f90: 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69  le are open. Thi
9fa0: 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67  s happens during
9fb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f  .        ** a ro
9fc0: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
9fd0: 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73  on that switches
9fe0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
9ff0: 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a  de=off.        *
a000: 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  * to journal_mod
a010: 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  e=wal..        *
a020: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
a030: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
a040: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
a050: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a060: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a070: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a080: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a090: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a0a0: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
a0b0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a0c0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a0d0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a0e0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
a0f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a100: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a110: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
a120: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a130: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a140: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a150: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
a160: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a170: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a180: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
a190: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a1a0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a1b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a1c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a1d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a1e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a1f0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a200: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a210: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
a220: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a230: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a240: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a250: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a260: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a270: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a280: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a290: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a2a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a2b0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a2c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a2d0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a2e0: 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  <=pPager->dbHint
a2f0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a300: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a310: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a320: 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  SHED:.      asse
a330: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a340: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a360: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a370: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a380: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a390: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a3a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a3b0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a3c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a3d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a3e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a3f0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a400: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a410: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a420: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a430: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a440: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a450: 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20  ERROR:.      /* 
a460: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  There must be at
a470: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
a480: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
a490: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66   to the pager if
a4a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52  .      ** in ERR
a4b0: 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
a4c0: 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68  ise the pager sh
a4d0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
a4e0: 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20  y dropped.      
a4f0: 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  ** back to OPEN 
a500: 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
a510: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a520: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
a530: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a540: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a550: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
a560: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a570: 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  >0 );.      brea
a580: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
a590: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a5a0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
a5b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a5c0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
a5d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
a5e0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
a5f0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
a600: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
a610: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
a620: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
a630: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a640: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
a650: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
a660: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
a670: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
a680: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
a690: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
a6a0: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
a6b0: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
a6c0: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
a6d0: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
a6e0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
a6f0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a700: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a710: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
a720: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
a730: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
a740: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
a750: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
a760: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
a770: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
a780: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
a790: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
a7a0: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
a7b0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
a7c0: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
a7d0: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
a7e0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
a7f0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
a800: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
a810: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
a820: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
a830: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
a840: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
a850: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
a860: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
a870: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
a880: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
a890: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
a8a0: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
a8b0: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
a8c0: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
a8d0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
a8e0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
a8f0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
a900: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
a910: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
a920: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
a930: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
a940: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a950: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
a960: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
a970: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
a980: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a990: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a9a0: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
a9b0: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a9c0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a9d0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
a9e0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
a9f0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
aa00: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aa10: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
aa20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
aa30: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
aa40: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
aa50: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
aa60: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
aa70: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
aa80: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
aa90: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
aaa0: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
aab0: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
aac0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
aad0: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
aae0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
aaf0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
ab00: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
ab10: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
ab20: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
ab30: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
ab40: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
ab50: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
ab60: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
ab70: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
ab80: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
ab90: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
aba0: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
abb0: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
abc0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
abd0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
abe0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
abf0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
ac00: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ac10: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac20: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
ac30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ac40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ac50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
ac60: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
ac70: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ac80: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ac90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
aca0: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
acb0: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
acc0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
acd0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
ace0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
acf0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
ad00: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ad10: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ad20: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
ad30: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
ad40: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
ad50: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
ad60: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
ad70: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
ad80: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
ad90: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
ada0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
adb0: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
adc0: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
add0: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
ade0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
adf0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
ae00: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
ae10: 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  f it is necessar
ae20: 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20  y to write page 
ae30: 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75  *pPg into the su
ae40: 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20  b-journal..** A 
ae50: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
ae60: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ae70: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
ae80: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ae90: 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65  e.** or more ope
aea0: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72  n savepoints for
aeb0: 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20   which:.**.**   
aec0: 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  * The page-numbe
aed0: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
aee0: 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72  r equal to Pager
aef0: 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c  Savepoint.nOrig,
af00: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
af10: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
af20: 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75  g to the page-nu
af30: 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20  mber is not set 
af40: 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  in.**     PagerS
af50: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
af60: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
af70: 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65   int subjRequire
af80: 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  sPage(PgHdr *pPg
af90: 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  ){.  Pgno pgno =
afa0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61   pPg->pgno;.  Pa
afb0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
afc0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
afd0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
afe0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
aff0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  int; i++){.    P
b000: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b010: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
b020: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
b030: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
b040: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
b050: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
b060: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
b070: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b080: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
b090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
b0a0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
b0b0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
b0c0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
b0d0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
b0e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
b0f0: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
b100: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b110: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b120: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
b130: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
b140: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
b150: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
b160: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
b170: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b180: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
b190: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
b1a0: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
b1b0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b1c0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
b1d0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
b1e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b1f0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b200: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
b210: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
b220: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b230: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b240: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b250: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b260: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b270: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b280: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b290: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b2a0: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b2b0: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b2c0: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b2d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b2e0: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b2f0: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b320: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b330: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b340: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b350: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b360: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b370: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b380: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b390: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b3a0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b3b0: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b3c0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b3d0: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b3e0: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b3f0: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b400: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b410: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b420: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b430: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b440: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b450: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b460: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b470: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b480: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b490: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b4a0: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b4c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b4d0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b4e0: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b4f0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b500: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b510: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b520: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b530: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b540: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b550: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b560: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b570: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b580: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b590: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b5a0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b5b0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b5c0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b5d0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b5e0: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b5f0: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b600: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b610: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b620: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b630: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b640: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b650: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b660: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b670: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b680: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b690: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b6a0: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
b6b0: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
b6c0: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
b6d0: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
b6e0: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
b6f0: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b700: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b710: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
b720: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
b730: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
b740: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
b750: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
b760: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
b770: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
b780: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
b790: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b7a0: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
b7b0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
b7c0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
b7d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b7e0: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
b800: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20  ACE(("UNLOCK %p 
b810: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
b820: 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74  Lock)).  }.  ret
b830: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b840: 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   Lock the databa
b850: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b860: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b870: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41  st be either SHA
b880: 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53  RED_LOCK,.** RES
b890: 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58  ERVED_LOCK or EX
b8a0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66  CLUSIVE_LOCK. If
b8b0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73   the caller is s
b8c0: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
b8d0: 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  he.** Pager.eLoc
b8e0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
b8f0: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
b900: 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ate. .**.** Exce
b910: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b920: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b930: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b940: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b950: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
b960: 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c  ot modify it unl
b970: 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b  ess the new lock
b980: 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43  ing state is EXC
b990: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a  LUSIVE_LOCK. .**
b9a0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b9b0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b9c0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
b9d0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b9e0: 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69  ation .** of thi
b9f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
ba00: 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67   pagerLockDb(Pag
ba10: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
ba20: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
ba30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
ba40: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
ba50: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
ba60: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
ba70: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
ba80: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
ba90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
baa0: 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61  ock<eLock || pPa
bab0: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
bac0: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
bad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
bae0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
baf0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
bb00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
bb10: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
bb20: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
bb30: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
bb40: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
bb50: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
bb60: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
bb70: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
bb80: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
bb90: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
bba0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bbb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
bbc0: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
bbd0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
bbe0: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
bbf0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
bc00: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
bc10: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
bc20: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
bc30: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
bc40: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
bc50: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
bc60: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
bc70: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
bc80: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
bc90: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
bca0: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
bcb0: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
bcc0: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
bcd0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
bce0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
bcf0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bd00: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
bd10: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
bd20: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
bd30: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
bd40: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
bd50: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
bd60: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
bd70: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
bd80: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
bd90: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
bda0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
bdb0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
bdc0: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
bdd0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
bde0: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
bdf0: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
be00: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
be10: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
be20: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
be30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
be40: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
be50: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
be60: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
be70: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
be80: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
be90: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
bea0: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
beb0: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
bec0: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
bed0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
bee0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
bef0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
bf00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bf20: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
bf30: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
bf40: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bf60: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
bf70: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
bfa0: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
bfb0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
bfc0: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
bfd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
bfe0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
bff0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
c000: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
c010: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
c020: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
c030: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
c040: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c050: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
c060: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
c070: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c080: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
c090: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
c0a0: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
c0b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c0c0: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
c0d0: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
c0e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
c0f0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
c100: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
c110: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c120: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
c130: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
c140: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
c150: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c160: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c170: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c180: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c190: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c1a0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c1b0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c1c0: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c1d0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c1e0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c1f0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c200: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c210: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c220: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c230: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c240: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c250: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c260: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c270: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c280: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c290: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c2a0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c2b0: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c2c0: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c2d0: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c2e0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c2f0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c300: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c310: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c320: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c330: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c340: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c350: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c360: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c370: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c380: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c390: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c3a0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c3b0: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c3c0: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c3d0: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c3e0: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c3f0: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c400: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c410: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c420: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c430: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c440: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c450: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c460: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c470: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c480: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c490: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c4a0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c4b0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c4c0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
c4d0: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
c4e0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
c4f0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
c500: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
c510: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
c520: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
c530: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
c540: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
c550: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
c560: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
c570: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
c580: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
c590: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
c5a0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
c5b0: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
c5c0: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
c5d0: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
c5e0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
c5f0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
c600: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
c620: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
c630: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c640: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
c650: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
c660: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
c670: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
c680: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c690: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
c6a0: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
c6b0: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
c6c0: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
c6d0: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
c6e0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
c6f0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
c700: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
c710: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
c720: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
c730: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
c740: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
c750: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c760: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c770: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
c780: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
c790: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
c7a0: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
c7b0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
c7c0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
c7d0: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
c7e0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
c7f0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
c800: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
c810: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
c820: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
c830: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c840: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
c850: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
c860: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
c870: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
c880: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
c890: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
c8a0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
c8b0: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
c8c0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
c8d0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c8e0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
c8f0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
c900: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
c910: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c920: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c930: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
c940: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
c950: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
c960: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
c970: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c980: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
c990: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
c9a0: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
c9b0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
c9c0: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
c9d0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
c9e0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
c9f0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
ca00: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
ca10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ca20: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
ca30: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
ca40: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
ca50: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
ca60: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
ca70: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
ca80: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
ca90: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
caa0: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
cab0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
cac0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
cad0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
cae0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
caf0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
cb00: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
cb10: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
cb20: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
cb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
cb40: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
cb50: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
cb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
cb70: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
cb80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cb90: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
cbc0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
cbd0: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
cbe0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
cc10: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
cc20: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
cc30: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
cc40: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
cc50: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
cc60: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cc70: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
cc80: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
cc90: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
cca0: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
ccb0: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
ccc0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
ccd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
cce0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
ccf0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
cd00: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
cd10: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cd20: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cd30: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
cd40: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
cd50: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cd60: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cd70: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
cd80: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
cd90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
cda0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
cdb0: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
cdc0: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
cdd0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
cde0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
cdf0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
ce00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
ce10: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
ce20: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
ce30: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
ce40: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
ce50: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
ce60: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
ce70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ce80: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
ce90: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
cea0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
ceb0: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
cec0: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
ced0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
cee0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
cef0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
cf00: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
cf10: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
cf20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cf30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cf40: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
cf50: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
cf60: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
cf70: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
cf80: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
cf90: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
cfa0: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
cfb0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
cfc0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
cfd0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
cfe0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
cff0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
d000: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d020: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
d030: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
d040: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
d050: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
d060: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
d070: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d080: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
d090: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
d0a0: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
d0b0: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
d0c0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
d0d0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
d0e0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
d0f0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
d100: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
d110: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
d140: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
d150: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
d160: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
d170: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
d180: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d1a0: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
d1d0: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
d1e0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
d1f0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
d200: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
d210: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
d220: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
d230: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
d240: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
d250: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d260: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
d270: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d280: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
d290: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
d2a0: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
d2b0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d2c0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
d2d0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
d2e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d2f0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
d300: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
d310: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d320: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d330: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d340: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d350: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d360: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d370: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d380: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
d390: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
d3a0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
d3b0: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
d3c0: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
d3d0: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
d3e0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
d3f0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
d400: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d410: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
d420: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
d430: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
d440: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
d450: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d460: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
d470: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
d480: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
d490: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d4a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
d4b0: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
d4c0: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
d4d0: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
d4e0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
d4f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
d500: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
d510: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
d520: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
d530: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
d540: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
d550: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
d560: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
d570: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
d580: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
d590: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
d5a0: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
d5b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
d5c0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
d5d0: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
d5e0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
d5f0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
d600: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
d610: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
d620: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
d630: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
d640: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
d650: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
d660: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
d670: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
d680: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
d690: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
d6a0: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
d6b0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
d6c0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
d6d0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
d6e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
d6f0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
d700: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
d710: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
d720: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
d730: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d760: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d770: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d780: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
d790: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
d7a0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d7b0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
d7c0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
d7d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
d7e0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d7f0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
d800: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
d810: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
d820: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
d830: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
d840: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
d850: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
d860: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
d870: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d880: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d890: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
d8a0: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
d8b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
d8c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d8d0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
d8e0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
d8f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
d900: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
d910: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
d920: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d930: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
d940: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
d950: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
d960: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
d970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d980: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d990: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d9a0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d9b0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d9c0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d9d0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d9e0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d9f0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
da00: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
da10: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
da20: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
da30: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
da40: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
da50: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
da60: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
da70: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
da80: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
da90: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
daa0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
dab0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
dac0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
dad0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
dae0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
daf0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
db00: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
db10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
db20: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
db30: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
db40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
db50: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
db60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
db70: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
db80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
db90: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
dba0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
dbb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
dbc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
dbd0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
dbe0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
dbf0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
dc00: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
dc10: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
dc20: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
dc30: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
dc40: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
dc50: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
dc60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
dc70: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
dc80: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
dc90: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
dca0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
dcb0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
dcc0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
dcd0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
dce0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
dcf0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
dd00: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dd10: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
dd20: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
dd30: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
dd40: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
dd50: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
dd60: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
dd70: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
dd80: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
dd90: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
dda0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
ddb0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
ddc0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
ddd0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dde0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
ddf0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
de00: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
de10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de20: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
de30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
de40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
de50: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
de60: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
de70: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
de80: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
de90: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
dea0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
deb0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
dec0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
ded0: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
dee0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
def0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
df00: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
df10: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
df20: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
df50: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
df60: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
df90: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
dfa0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
dfb0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
dfc0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
dfd0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
dfe0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
dff0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
e000: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e010: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
e020: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e030: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e040: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
e050: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
e060: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
e070: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
e080: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
e090: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
e0a0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e0b0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
e0c0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
e0d0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
e0e0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e0f0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e100: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e110: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e120: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e130: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e140: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e150: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e160: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e170: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e180: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e190: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e1a0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e1b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e1c0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e1d0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e1e0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e1f0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e200: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e210: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e220: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e230: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e240: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e250: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e260: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e270: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e280: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e290: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e2a0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e2b0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e2c0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e2d0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e2e0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e2f0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e300: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e310: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e320: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e330: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e340: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e350: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e360: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e370: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e380: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e390: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e3a0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e3b0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e3c0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e3d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e3e0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e3f0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e400: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e410: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e420: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e430: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e440: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e450: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e460: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e470: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e480: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e490: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e4a0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e4b0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e4c0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e4d0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e4e0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e4f0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e500: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e510: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e520: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e530: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e540: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e550: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e560: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e570: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e580: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e590: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e5a0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e5b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e5c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e5d0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e5e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e5f0: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e600: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e610: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e620: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e630: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e640: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e650: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e660: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e670: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e680: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e690: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e6a0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e6b0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e6c0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e6d0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e6e0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e6f0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e700: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e710: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e720: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e730: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e740: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e750: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e760: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
e770: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e780: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e790: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e7a0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e7b0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e7c0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e7d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e7e0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e7f0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e800: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e810: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e820: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e830: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e840: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e850: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e860: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e870: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e880: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e890: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e8a0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e8b0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e8c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e8d0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e8e0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e8f0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e900: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e910: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e920: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e930: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e940: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e950: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e960: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e970: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e980: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e990: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e9a0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e9b0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e9c0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e9d0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e9e0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e9f0: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
ea00: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
ea10: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
ea20: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
ea30: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
ea40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ea50: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
ea60: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
ea70: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ea80: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
ea90: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
eaa0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
eab0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
eac0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
ead0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
eae0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
eaf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
eb00: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
eb10: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
eb20: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
eb30: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
eb40: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
eb50: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
eb60: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
eb70: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
eb80: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
eb90: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
eba0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
ebb0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ebc0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
ebd0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
ebe0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
ebf0: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
ec00: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
ec10: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
ec20: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
ec30: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
ec40: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
ec50: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
ec60: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
ec70: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
ec80: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
ec90: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
eca0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
ecb0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
ecc0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
ecd0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
ece0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
ecf0: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
ed00: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
ed10: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
ed20: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
ed30: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
ed40: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
ed50: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
ed60: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
ed70: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
ed80: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
ed90: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
eda0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
edb0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
edc0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
edd0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ede0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
edf0: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ee00: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
ee10: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ee20: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ee30: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ee40: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ee50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ee60: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ee70: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ee80: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
ee90: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
eea0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
eeb0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
eec0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eed0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
eee0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
eef0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ef00: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
ef10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ef20: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
ef30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ef40: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ef50: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
ef60: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ef70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ef80: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
ef90: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
efa0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
efb0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
efc0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
efd0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
efe0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
eff0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
f000: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
f010: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
f020: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f030: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f040: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
f050: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
f060: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
f070: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
f080: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
f090: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
f0a0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
f0b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f0c0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
f0d0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
f0e0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f0f0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f100: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f110: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f120: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f130: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f140: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f150: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f160: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f170: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f180: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f190: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f1a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f1b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f1c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f1d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f1e0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f1f0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f200: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f210: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f220: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f230: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f240: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f250: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f260: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f270: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f280: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f290: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f2a0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f2b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f2c0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f2d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f2f0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f300: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f320: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f330: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f340: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f360: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f370: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f380: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f390: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f3b0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f3c0: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f3d0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f3e0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f3f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f400: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f410: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f420: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f450: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f460: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f470: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f480: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f490: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f4a0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4c0: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f4d0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f4e0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f4f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f500: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f510: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f520: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f530: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f540: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f550: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f560: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f570: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f580: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f590: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f5a0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f5b0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f5c0: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f5d0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f5e0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f5f0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f600: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f610: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f630: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f640: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f650: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f660: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f670: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f680: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f690: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f6a0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f6b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f6c0: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f6d0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f6e0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f6f0: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f700: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f710: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f720: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f730: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f740: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f750: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f760: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f770: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f780: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f790: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f7a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f7b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f7c0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f7d0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f7e0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f7f0: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f800: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f810: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f820: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f830: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f840: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f850: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f880: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f890: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f8a0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f8b0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f8c0: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f8d0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f8e0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f8f0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f900: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f910: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f920: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f930: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f940: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f950: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f960: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f970: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f980: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f990: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f9a0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f9b0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f9c0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f9d0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f9e0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f9f0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fa00: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fa10: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fa20: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
fa30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
fa40: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
fa50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fa60: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
fa70: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
fa80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
fa90: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
faa0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
fab0: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
fac0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
fad0: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
fae0: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
faf0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
fb00: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
fb10: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
fb20: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
fb30: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
fb40: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
fb50: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fb60: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fb70: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
fb80: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
fb90: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fba0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fbb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fbc0: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
fbd0: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
fbe0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fbf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
fc00: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
fc10: 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
fc20: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
fc30: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
fc40: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
fc50: 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
fc60: 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
fc70: 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
fc80: 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
fc90: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
fca0: 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
fcb0: 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
fcc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fcd0: 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
fce0: 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
fcf0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fd00: 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
fd10: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
fd20: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
fd30: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
fd40: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
fd50: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
fd60: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
fd70: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
fd80: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
fd90: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
fda0: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
fdb0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fdc0: 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
fdd0: 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
fde0: 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
fdf0: 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
fe00: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
fe10: 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
fe20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
fe30: 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
fe50: 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
fe60: 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
fe70: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
fe80: 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
fe90: 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
fea0: 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
feb0: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
fec0: 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
fed0: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
fee0: 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
fef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
ff00: 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
ff10: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
ff20: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
ff30: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
ff40: 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
ff50: 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
ff60: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
ff70: 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
ff80: 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
ff90: 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
ffa0: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
ffb0: 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
ffc0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
ffd0: 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
ffe0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
fff0: 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
10000 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10010 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10020 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
10030 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
10040 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
10050 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
10060 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
10070 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
10080 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
10090 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
100a0 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
100b0 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
100c0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
100d0 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
100e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
100f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10100 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
10110 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
10120 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
10130 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10140 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
10150 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
10160 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10170 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10180 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10190 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
101a0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
101b0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
101c0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
101d0 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
101e0 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
101f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10200 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
10210 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
10220 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10230 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10240 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10250 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10260 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10270 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10280 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10290 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
102a0 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
102b0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
102c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
102d0 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
102e0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
102f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10300 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
10310 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
10320 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10330 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10340 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10350 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10360 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10370 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10380 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10390 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
103a0 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
103b0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
103c0 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
103d0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
103e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
103f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10400 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
10410 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
10420 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10430 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10440 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10450 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10460 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10470 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10480 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10490 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
104a0 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
104b0 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
104c0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
104d0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
104e0 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
104f0 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10500 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10510 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
10520 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10530 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10540 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10550 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10560 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10570 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10580 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10590 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
105a0 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
105b0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
105c0 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
105d0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
105e0 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
105f0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10600 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
10610 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
10620 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10630 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10640 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10650 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10660 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10670 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10680 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10690 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
106c0 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
106f0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10700 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10730 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
10740 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10750 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10770 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10780 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10790 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
107a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
107b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
107c0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
107d0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
107e0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
107f0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10800 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
10810 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
10820 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
10830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10840 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10850 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
10860 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10870 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10880 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
10890 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
108a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
108b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
108c0 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
108d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
108e0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
108f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
10900 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
10910 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
10920 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
10930 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
10940 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
10950 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
10960 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
10970 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
10980 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
10990 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
109a0 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
109b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
109c0 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
109d0 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
109e0 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
109f0 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
10a00 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
10a10 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
10a20 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
10a30 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
10a40 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
10a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
10a60 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
10a70 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
10a80 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10a90 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
10aa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
10ab0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10ac0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
10ad0 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
10ae0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
10af0 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
10b00 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
10b10 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
10b20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
10b30 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
10b40 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
10b50 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
10b60 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
10b70 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
10b80 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10b90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10ba0 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
10bb0 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
10bc0 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10bd0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10be0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10bf0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
10c00 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
10c10 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10c20 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10c30 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10c40 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
10c50 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
10c60 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10c70 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10c80 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10c90 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
10ca0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10cb0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10cc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
10cd0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
10ce0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10cf0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
10d00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10d10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10d20 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
10d30 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
10d40 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
10d50 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
10d60 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
10d70 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
10d80 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
10d90 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
10da0 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
10db0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
10dc0 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
10dd0 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
10de0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
10df0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
10e00 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
10e10 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
10e20 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
10e30 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
10e40 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
10e50 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
10e60 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
10e70 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
10e80 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
10e90 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
10ea0 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
10eb0 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
10ec0 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
10ed0 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
10ee0 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
10ef0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
10f00 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
10f10 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
10f20 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
10f30 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10f40 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
10f50 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
10f60 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
10f70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
10f80 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
10f90 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
10fa0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
10fb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10fc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10fd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
10fe0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
10ff0 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
11000 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
11010 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
11020 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
11030 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
11040 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
11050 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
11060 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
11070 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
11080 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
11090 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
110a0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
110b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
110d0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
110e0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
110f0 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
11100 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
11110 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
11120 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
11130 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
11140 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
11150 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
11160 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
11170 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
11180 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
11190 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
111a0 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
111b0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
111c0 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
111d0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
111e0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
111f0 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11200 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11210 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11220 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61  er){.  sqlite3Ba
11230 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
11240 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
11250 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
11260 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
11270 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  he);.}../*.** Fr
11280 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11290 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
112a0 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
112b0 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
112c0 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
112d0 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
112e0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
112f0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11300 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
11310 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
11320 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11330 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11340 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11350 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11360 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11370 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11390 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
113a0 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
113b0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
113c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
113d0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
113e0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
113f0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11400 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
11410 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
11420 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11430 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11440 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11450 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
11460 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11480 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11490 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
114a0 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
114b0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
114c0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
114d0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
114e0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
114f0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
11500 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
11510 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
11520 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
11530 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
11540 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
11550 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
11560 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11580 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11590 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
115a0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
115b0 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
115c0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
115d0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
115e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
115f0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
11600 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11610 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11620 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11640 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11650 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
11660 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11670 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11680 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11690 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
116a0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
116b0 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
116c0 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
116d0 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
116e0 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
116f0 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
11700 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
11710 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
11720 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
11730 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
11740 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
11750 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
11760 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11780 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11790 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
117a0 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
117b0 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
117c0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
117d0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
117e0 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
117f0 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
11800 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
11810 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11820 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11830 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
11840 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
11850 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
11860 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11870 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11880 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11890 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
118a0 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
118b0 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
118c0 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
118d0 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
118e0 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
118f0 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11900 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
11910 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
11920 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
11930 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11940 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
11950 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
11960 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11970 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11980 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11990 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
119a0 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
119b0 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
119c0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
119d0 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
119e0 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
119f0 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11a00 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
11a10 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
11a20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
11a30 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
11a40 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
11a50 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
11a60 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11a70 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11a80 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11a90 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11aa0 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11ab0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11ac0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11ad0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11ae0 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11af0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11b00 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
11b10 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
11b20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11b30 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
11b40 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11b50 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
11b60 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11b70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11b80 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11b90 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11ba0 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11bb0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
11bd0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11be0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
11bf0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
11c00 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
11c10 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
11c20 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11c30 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11c40 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11c50 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11c60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c80 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11c90 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11ca0 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11cb0 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11cc0 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11cd0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11ce0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11cf0 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11d00 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11d10 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11d20 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11d30 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11d40 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11d60 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11d70 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11d80 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11d90 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11da0 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11db0 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11dc0 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11dd0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11de0 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11df0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11e00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11e10 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
11e20 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11e30 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11e40 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
11e50 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11e60 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11e70 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
11e80 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11e90 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11ea0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
11eb0 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
11ec0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11ed0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
11ee0 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
11ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11f00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11f10 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
11f20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
11f30 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
11f40 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
11f50 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
11f60 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
11f70 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
11f80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
11f90 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11fa0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
11fb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
11fc0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
11fd0 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
11fe0 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
11ff0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
12000 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
12010 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
12020 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
12030 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
12040 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
12050 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
12060 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
12070 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
12080 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
12090 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
120a0 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
120b0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
120c0 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
120d0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
120e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
120f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
12100 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
12110 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
12120 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
12130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12140 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
12150 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
12160 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
12170 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
12180 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
12190 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
121a0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
121b0 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
121c0 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
121d0 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
121e0 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
121f0 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
12200 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
12210 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12220 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12230 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
12240 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
12250 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12260 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12270 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12280 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
122a0 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
122b0 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
122c0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
122d0 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
122e0 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
122f0 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
12300 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
12310 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12320 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
12330 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
12340 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
12350 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
12360 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12370 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12380 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12390 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
123a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
123b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
123c0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
123d0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
123e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
123f0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12400 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
12410 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
12420 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12430 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
12440 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
12450 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
12460 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12470 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12480 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12490 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
124a0 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
124b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
124c0 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
124d0 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
124e0 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
124f0 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12500 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
12510 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
12520 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
12530 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
12540 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
12550 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
12560 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12570 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12580 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12590 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
125a0 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
125b0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
125c0 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
125d0 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
125e0 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
125f0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12600 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
12610 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12620 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
12630 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
12640 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
12650 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
12660 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12670 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12680 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12690 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
126a0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
126b0 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
126c0 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
126d0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
126e0 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
126f0 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12700 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
12710 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
12720 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12730 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
12740 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
12750 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
12760 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12770 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12780 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12790 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
127a0 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
127b0 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
127c0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
127d0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
127e0 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
127f0 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12800 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
12810 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
12820 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
12830 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12840 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
12850 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
12860 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12870 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12880 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12890 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
128a0 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
128b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
128c0 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
128d0 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
128e0 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
128f0 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12910 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
12920 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
12930 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12940 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
12950 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12960 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12970 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12980 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12990 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
129a0 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
129b0 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
129c0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
129d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
129e0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
129f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12a00 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
12a10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12a20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
12a30 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
12a40 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12a50 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
12a60 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
12a70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
12a80 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
12a90 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
12aa0 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
12ab0 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
12ac0 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
12ad0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
12ae0 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
12af0 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
12b00 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
12b10 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
12b20 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
12b30 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
12b40 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
12b50 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
12b60 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12b70 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
12b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
12b90 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12ba0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
12bb0 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
12bc0 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73   state. If it is
12bd0 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41   called.** in PA
12be0 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45  GER_NONE or PAGE
12bf0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61  R_SHARED state a
12c00 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64  nd the lock held
12c10 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c   is less.** excl
12c20 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53  usive than a RES
12c30 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69  ERVED lock, it i
12c40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12c50 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
12c60 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
12c70 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
12c80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
12c90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
12ca0 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
12cb0 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
12cc0 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
12cd0 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
12ce0 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
12cf0 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
12d00 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
12d10 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
12d20 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
12d30 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
12d40 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
12d50 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
12d60 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
12d70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
12d80 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
12d90 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12da0 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
12db0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
12dc0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
12dd0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
12de0 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
12df0 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
12e00 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
12e10 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
12e20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
12e30 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12e40 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
12e50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
12e60 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
12e70 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
12e80 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
12e90 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
12ea0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
12eb0 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
12ec0 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
12ed0 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
12ee0 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
12ef0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
12f00 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12f10 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
12f20 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
12f30 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
12f40 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
12f50 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
12f60 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
12f70 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
12f80 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
12f90 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
12fa0 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
12fb0 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
12fc0 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
12fd0 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
12fe0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
12ff0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
13000 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
13010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
13020 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13030 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
13040 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
13050 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
13060 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13070 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
13080 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
13090 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
130a0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
130b0 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
130c0 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
130d0 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
130e0 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
130f0 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
13100 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13110 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
13120 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
13130 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
13140 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
13150 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
13160 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
13170 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
13180 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   the pager moves
13190 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
131a0 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75   state..** If ru
131b0 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
131c0 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20  lusive rollback 
131d0 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f  mode, the lock o
131e0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a  n the file is .*
131f0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
13200 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  a SHARED_LOCK..*
13210 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
13220 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
13230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
13240 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13250 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
13260 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
13270 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
13280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13290 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
132a0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
132b0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
132c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
132d0 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
132e0 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
132f0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
13310 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
13320 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
13330 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
13340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
13350 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
13360 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
13370 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
13380 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
13390 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
133a0 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
133b0 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
133c0 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
133d0 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
133e0 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
133f0 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
13400 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
13410 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
13420 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
13430 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
13440 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  aster, int bComm
13450 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  it){.  int rc = 
13460 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13470 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13480 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
13490 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
134a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
134b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
134c0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
134d0 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
134e0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
134f0 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13500 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
13510 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
13520 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
13530 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
13540 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
13550 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
13560 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
13570 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
13580 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
13590 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
135a0 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
135b0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
135c0 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
135d0 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
135e0 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
135f0 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13600 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
13610 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
13620 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
13630 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
13640 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
13650 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
13660 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
13670 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
13680 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
13690 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
136a0 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
136b0 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
136c0 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
136d0 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
136e0 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
136f0 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13700 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
13710 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
13720 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13730 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
13740 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
13750 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
13760 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13770 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
13780 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
13790 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
137a0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
137b0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
137c0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
137d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
137e0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
137f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13800 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
13810 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
13820 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
13830 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13850 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
13860 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
13870 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
13880 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13890 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
138a0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
138b0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
138c0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
138d0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
138e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
138f0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13900 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13910 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
13920 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
13930 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
13940 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13960 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13970 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
13980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13990 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
139a0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
139b0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
139c0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
139d0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
139e0 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
139f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13a00 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
13a10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13a20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13a30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13a40 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
13a50 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
13a60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
13a70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13a80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
13a90 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13aa0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13ab0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13ac0 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13ad0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13ae0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13af0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13b00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
13b10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
13b20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
13b30 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
13b40 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
13b50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13b60 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13b70 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
13b80 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
13b90 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
13ba0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13bb0 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13bc0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13bd0 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13be0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13bf0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13c00 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
13c10 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
13c20 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
13c30 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
13c40 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
13c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13c60 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13c70 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13c80 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13c90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
13ca0 65 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72  elete = (!pPager
13cb0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71  ->tempFile && sq
13cc0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73  lite3JournalExis
13cd0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29  ts(pPager->jfd))
13ce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13cf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13d00 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13d10 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
13d20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13d30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13d40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13d50 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
13d60 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
13d70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13d80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13d90 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
13da0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13db0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
13dd0 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
13de0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13df0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13e00 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13e10 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13e20 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
13e30 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13e40 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
13e50 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
13e60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13e70 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
13e80 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
13e90 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
13ea0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
13eb0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
13ec0 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
13ed0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61 67    PgHdr *p = pag
13ee0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13ef0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
13f00 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
13f10 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
13f20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13f30 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  f(p);.    }.  }.
13f40 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13f50 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13f60 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13f70 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
13f80 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13f90 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13fa0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13fb0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
13fc0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13fd0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13fe0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13ff0 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
14000 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
14010 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14020 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
14030 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
14040 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
14050 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
14060 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
14070 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
14080 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
14090 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
140a0 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
140b0 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
140c0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
140d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
140e0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
140f0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
14100 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
14110 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
14120 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
14130 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
14140 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14150 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
14160 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14170 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14180 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14190 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
141a0 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
141b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
141c0 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
141d0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
141e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
141f0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
14200 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
14210 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
14220 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
14230 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
14240 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
14250 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
14260 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14270 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14280 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
14290 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
142a0 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
142b0 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
142c0 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
142d0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
142e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
142f0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
14300 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
14310 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14320 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14330 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14340 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14350 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14360 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14370 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
14380 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14390 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
143a0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
143b0 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
143c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
143d0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
143e0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
143f0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14400 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14410 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
14420 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14430 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14440 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14450 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14460 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14470 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14480 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14490 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
144a0 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
144b0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
144c0 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
144d0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
144e0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
144f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14500 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14510 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14520 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14530 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14540 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14550 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14560 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14570 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14580 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14590 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
145a0 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
145b0 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
145c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
145d0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
145e0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
145f0 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14600 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14610 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
14620 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14630 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14640 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14650 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14660 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14670 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14680 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14690 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
146a0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
146b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
146c0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
146d0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
146e0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
146f0 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14700 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14710 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
14720 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14730 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14740 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14750 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14760 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14770 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14780 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14790 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
147a0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
147b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
147c0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
147d0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
147e0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
147f0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14800 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
14810 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14820 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14830 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14840 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14850 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14860 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14870 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14890 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
148a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
148b0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
148c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
148d0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
148e0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
148f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14900 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
14910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14920 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14930 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14940 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14950 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14960 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14970 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
14980 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
14990 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
149a0 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
149b0 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
149c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
149d0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
149e0 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
149f0 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
14a00 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
14a10 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
14a20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
14a30 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14a40 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
14a50 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
14a60 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
14a70 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
14a80 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
14a90 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
14aa0 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
14ab0 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
14ac0 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
14ad0 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
14ae0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
14af0 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
14b00 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
14b10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
14b20 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
14b30 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
14b40 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
14b50 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
14b60 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
14b70 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
14b80 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
14b90 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
14ba0 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
14bb0 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
14bc0 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
14bd0 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
14be0 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
14bf0 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
14c00 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
14c10 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
14c20 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
14c30 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
14c40 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
14c50 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
14c60 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
14c70 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
14c80 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
14c90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
14ca0 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
14cb0 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
14cc0 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
14cd0 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
14ce0 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
14cf0 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
14d00 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
14d10 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
14d20 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
14d30 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
14d40 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
14d50 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
14d60 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
14d70 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
14d80 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
14d90 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
14da0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
14db0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
14dc0 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
14dd0 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
14de0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14df0 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
14e00 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
14e10 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
14e20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
14e30 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
14e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
14e50 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
14e60 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
14e70 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
14e80 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
14e90 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
14ea0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
14eb0 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
14ec0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
14ed0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14ee0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
14ef0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
14f00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
14f10 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
14f20 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
14f30 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
14f60 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
14f70 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
14f80 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
14f90 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
14fa0 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
14fb0 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
14fc0 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
14fd0 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
14fe0 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
14ff0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
15000 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
15010 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
15020 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
15030 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
15040 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
15050 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
15060 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
15070 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
15080 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
15090 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
150a0 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
150b0 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
150c0 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
150d0 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
150e0 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
150f0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
15100 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
15110 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
15120 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
15130 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
15140 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15150 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
15160 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
15170 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15180 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
15190 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
151a0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
151b0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
151c0 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
151d0 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
151e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
151f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15200 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
15210 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
15220 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
15230 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
15240 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15250 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
15260 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
15270 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15280 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
15290 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
152a0 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
152b0 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
152c0 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
152d0 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
152e0 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
152f0 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15300 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
15310 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
15320 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
15330 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15340 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
15350 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15360 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15370 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
15380 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
15390 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
153a0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
153b0 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
153c0 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
153d0 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
153e0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
153f0 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15400 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
15410 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
15420 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
15430 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15440 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
15450 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
15460 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15470 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
15480 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
15490 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
154a0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
154b0 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
154c0 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
154d0 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
154e0 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
154f0 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15500 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
15510 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
15520 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
15530 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15540 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
15550 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
15560 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15570 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
15580 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
15590 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
155a0 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
155b0 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
155c0 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
155d0 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
155e0 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
155f0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15600 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
15610 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
15620 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
15630 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
15640 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
15650 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
15660 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15670 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
15680 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
15690 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
156a0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
156b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
156c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
156d0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
156e0 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
156f0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
15700 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
15710 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
15720 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
15730 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
15740 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
15750 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
15760 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
15770 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
15780 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
15790 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
157a0 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
157b0 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
157c0 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
157d0 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
157e0 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
157f0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
15800 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15820 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
15830 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
15840 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
15850 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15870 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
15880 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15890 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
158c0 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
158d0 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
158e0 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15900 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
15910 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
15920 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
15930 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
15940 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
15950 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
15960 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
15970 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
15980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15990 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
159a0 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
159b0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
159c0 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
159d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
159e0 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
159f0 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
15a00 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
15a10 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
15a20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
15a30 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
15a40 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
15a50 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
15a60 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
15a70 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
15a80 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
15a90 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
15aa0 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
15ab0 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
15ac0 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
15ad0 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
15ae0 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
15af0 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
15b00 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
15b10 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
15b20 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
15b30 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
15b40 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
15b50 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
15b60 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
15b70 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
15b80 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
15b90 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15ba0 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
15bb0 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
15bc0 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
15bd0 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
15be0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
15bf0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15c00 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
15c10 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
15c20 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15c30 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
15c40 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
15c50 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
15c60 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15c70 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
15c80 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15c90 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
15ca0 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
15cb0 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
15cc0 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
15cd0 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
15ce0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
15cf0 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
15d00 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
15d10 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
15d20 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
15d30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15d40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15d50 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
15d60 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
15d70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
15d80 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
15d90 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
15da0 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
15db0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15dc0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15dd0 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
15de0 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
15df0 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
15e00 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
15e10 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
15e20 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
15e30 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
15e40 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
15e50 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
15e60 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
15e70 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
15e80 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
15e90 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
15ea0 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
15eb0 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
15ec0 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
15ed0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
15ee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
15f00 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
15f10 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
15f20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15f30 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
15f40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15f50 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15f60 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
15f70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15f80 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
15f90 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
15fa0 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
15fb0 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
15fc0 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
15fd0 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
15fe0 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
15ff0 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
16000 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
16010 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
16020 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
16030 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
16040 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
16050 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
16060 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
16070 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
16080 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
16090 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
160a0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
160b0 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
160c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
160d0 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
160e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
160f0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
16100 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
16110 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16120 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
16130 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
16140 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
16150 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
16160 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
16170 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16180 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16190 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
161a0 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
161b0 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
161c0 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
161d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
161e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
161f0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16200 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
16210 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
16220 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
16230 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16250 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
16260 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16270 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72 65  played by before
16280 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16290 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
162a0 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
162b0 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
162c0 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
162d0 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
162e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
162f0 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16300 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16310 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16320 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16330 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16340 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16350 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16360 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16370 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16380 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16390 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
163a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
163b0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
163c0 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
163d0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
163e0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
163f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16400 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16410 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16420 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16430 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16440 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16450 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16460 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16470 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16480 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16490 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
164a0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
164b0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
164c0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
164d0 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
164e0 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
164f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16500 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16510 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16520 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16530 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16540 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16550 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16560 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16570 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16580 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16590 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
165a0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
165b0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
165c0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
165d0 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
165e0 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
165f0 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16600 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16610 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16620 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16630 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16640 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16650 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16660 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16670 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16680 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16690 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
166a0 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
166b0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
166c0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
166d0 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
166e0 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
166f0 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16700 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
16710 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
16720 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
16730 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
16740 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16750 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
16760 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
16770 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16780 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
167a0 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
167b0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
167c0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
167d0 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
167e0 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
167f0 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16800 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
16810 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
16820 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
16830 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
16840 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
16850 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
16860 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
16870 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
16880 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
16890 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
168a0 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
168b0 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
168c0 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
168d0 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
168e0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
168f0 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
16900 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
16910 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
16920 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
16930 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
16940 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
16950 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
16960 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
16970 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
16980 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
16990 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
169a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
169b0 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
169c0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
169d0 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
169e0 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
169f0 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
16a00 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
16a10 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
16a20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
16a30 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
16a40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16a50 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
16a60 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
16a70 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
16a80 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
16a90 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
16aa0 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
16ab0 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
16ac0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16ad0 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
16ae0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16af0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
16b00 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
16b10 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
16b20 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
16b30 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
16b40 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
16b50 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
16b60 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16b70 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
16b80 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
16b90 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
16ba0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
16bb0 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
16bc0 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
16bd0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
16be0 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
16bf0 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
16c00 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
16c10 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
16c20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
16c30 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16c40 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
16c50 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
16c60 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
16c70 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
16c80 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
16c90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
16ca0 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
16cb0 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ==0 );.  PAGERTR
16cc0 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
16cd0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
16ce0 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
16cf0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
16d00 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
16d10 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
16d20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
16d30 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
16d40 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
16d50 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
16d60 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
16d70 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
16d80 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
16d90 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
16da0 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
16db0 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
16dc0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
16dd0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
16de0 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
16df0 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
16e00 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
16e10 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
16e20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16e30 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
16e40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16e50 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
16e60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16e70 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
16e80 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
16e90 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
16ea0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
16eb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
16ec0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
16ed0 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
16ee0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
16ef0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
16f00 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
16f10 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
16f20 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
16f30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
16f40 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
16f50 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
16f60 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
16f70 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
16f80 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
16f90 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
16fa0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
16fb0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
16fc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
16fd0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
16fe0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
16ff0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
17000 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
17010 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
17020 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
17030 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
17040 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
17050 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
17060 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
17070 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
17080 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
17090 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
170a0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
170b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
170c0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
170d0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
170e0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
170f0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
17100 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
17110 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
17120 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
17130 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
17140 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
17150 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
17160 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
17170 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
17180 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
17190 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
171a0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
171b0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
171c0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
171d0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
171e0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
171f0 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
17200 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
17210 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
17220 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
17230 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
17240 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
17250 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
17260 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
17270 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
17280 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17290 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
172a0 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
172b0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
172c0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
172d0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
172e0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
172f0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17300 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
17310 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
17320 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
17330 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
17340 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
17350 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
17360 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
17370 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17380 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
17390 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
173a0 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
173b0 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
173c0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
173d0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
173e0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
173f0 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
17400 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
17410 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
17420 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
17430 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
17440 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
17450 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
17460 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
17470 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
17480 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
17490 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
174a0 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
174b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
174c0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
174d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
174e0 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
174f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17500 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
17510 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
17520 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
17530 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
17540 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
17550 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
17560 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
17570 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
17580 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
17590 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
175a0 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
175b0 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
175c0 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
175d0 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
175e0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
175f0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
17600 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
17610 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
17620 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
17630 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
17640 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
17650 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
17660 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
17670 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
17680 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
17690 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
176a0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
176b0 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
176c0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
176d0 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
176e0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
176f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17700 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
17710 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
17720 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
17730 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
17740 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
17750 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17760 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
17770 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
17780 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
17790 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
177a0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
177b0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
177c0 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
177d0 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
177e0 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
177f0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
17800 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
17810 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
17820 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
17830 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
17840 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
17850 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
17860 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
17870 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
17880 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
17890 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
178a0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
178b0 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
178c0 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
178d0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
178e0 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
178f0 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
17900 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
17910 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
17920 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
17930 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
17940 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
17950 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
17960 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
17970 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
17980 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
17990 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
179a0 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
179b0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
179c0 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
179d0 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
179e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
179f0 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
17a00 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
17a10 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
17a20 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
17a30 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
17a40 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
17a50 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17a60 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17a70 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
17a80 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
17a90 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
17aa0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
17ab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
17ac0 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
17ad0 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
17ae0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
17af0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
17b00 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
17b10 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
17b20 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
17b30 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
17b40 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
17b50 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
17b60 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
17b70 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
17b80 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
17b90 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
17ba0 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
17bb0 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
17bc0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
17bd0 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
17be0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17bf0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
17c00 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
17c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
17c20 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
17c30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
17c40 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
17c50 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pPg);..    /* If
17c60 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
17c70 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
17c80 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
17c90 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
17ca0 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
17cb0 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
17cc0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
17cd0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
17ce0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
17cf0 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
17d00 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
17d10 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
17d20 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
17d30 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
17d40 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
17d50 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
17d60 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
17d70 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
17d80 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
17d90 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69  NOMEM);.    sqli
17da0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
17db0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
17dc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17dd0 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
17de0 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
17df0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17e00 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
17e10 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
17e20 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
17e30 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
17e40 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
17e50 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
17e60 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
17e70 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
17e80 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
17e90 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
17ea0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17eb0 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
17ec0 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
17ed0 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
17ee0 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
17ef0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
17f00 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
17f10 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
17f20 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
17f30 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17f40 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
17f50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17f60 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
17f70 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
17f80 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
17f90 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
17fa0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
17fb0 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
17fc0 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
17fd0 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
17fe0 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
17ff0 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
18000 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
18010 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
18020 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
18030 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
18040 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
18050 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
18060 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
18070 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
18080 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
18090 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
180a0 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
180b0 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
180c0 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
180d0 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
180e0 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
180f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18100 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
18110 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
18120 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
18130 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
18140 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
18150 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
18160 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
18170 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18180 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
18190 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
181a0 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
181b0 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
181c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
181d0 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
181e0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
181f0 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
18200 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18210 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
18220 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
18230 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
18240 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
18250 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
18260 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
18270 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
18280 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
18290 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
182a0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
182b0 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
182c0 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
182d0 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
182e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
182f0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
18300 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
18310 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
18320 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18330 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
18340 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
18350 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
18360 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
18370 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
18380 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
18390 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
183a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
183b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
183c0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
183d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
183e0 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
183f0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
18400 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
18410 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
18420 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
18430 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
18440 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
18450 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
18460 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
18470 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18480 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
18490 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
184a0 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
184b0 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
184c0 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
184d0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
184e0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
184f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
18500 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
18510 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
18520 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
18530 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
18540 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
18550 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
18560 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
18570 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
18580 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
18590 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
185a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
185b0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
185c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
185d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
185e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
185f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
18600 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
18610 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
18620 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18630 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
18640 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
18650 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
18660 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
18670 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18680 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
18690 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
186a0 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
186b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
186c0 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
186d0 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
186e0 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
186f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18700 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
18710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18720 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
18730 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
18740 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
18750 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18760 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
18770 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
18780 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
18790 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
187a0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
187b0 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
187c0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
187d0 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
187e0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
187f0 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
18800 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
18810 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
18820 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
18830 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
18840 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
18850 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
18860 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
18870 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
18880 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
18890 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
188a0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
188b0 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
188c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
188d0 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
188e0 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
188f0 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
18900 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
18910 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
18920 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
18930 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
18940 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
18950 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
18960 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
18970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18980 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
18990 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
189a0 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
189b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
189c0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
189d0 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  _out;..  /* Load
189e0 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
189f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18a00 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
18a10 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71  ned from.  ** sq
18a20 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
18a30 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
18a40 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
18a50 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20     Also obtain. 
18a60 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73   ** sufficient s
18a70 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72  pace (in zMaster
18a80 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65  Ptr) to hold the
18a90 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72   names of master
18aa0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
18ab0 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  les extracted fr
18ac0 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62  om regular rollb
18ad0 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20  ack-journals..  
18ae0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
18af0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
18b00 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
18b10 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
18b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
18b30 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18b40 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20  .  nMasterPtr = 
18b50 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
18b60 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  +1;.  zMasterJou
18b70 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  rnal = sqlite3Ma
18b80 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65  lloc((int)nMaste
18b90 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
18ba0 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
18bb0 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
18bc0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
18bd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18be0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18bf0 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ut;.  }.  zMaste
18c00 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
18c10 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
18c20 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d  urnal+1];.  rc =
18c30 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
18c40 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
18c50 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
18c60 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
18c70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18c80 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
18c90 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61  aster_out;.  zMa
18ca0 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
18cb0 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b  terJournal] = 0;
18cc0 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a  ..  zJournal = z
18cd0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
18ce0 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
18cf0 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
18d00 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
18d10 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73   ){.    int exis
18d20 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ts;.    rc = sql
18d30 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
18d40 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
18d50 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
18d60 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
18d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
18d90 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
18db0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
18dc0 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
18dd0 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
18de0 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
18df0 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
18e00 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
18e10 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
18e20 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
18e30 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
18e40 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
18e50 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
18e60 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
18e70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
18e80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
18e90 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   c;.      int fl
18ea0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
18eb0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
18ec0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
18ed0 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
18ee0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
18ef0 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
18f00 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
18f10 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
18f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18f30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
18f40 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
18f50 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
18f60 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
18f70 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
18f80 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
18f90 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
18fa0 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
18fb0 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
18fc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18fd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
18fe0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
18ff0 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
19000 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
19010 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
19020 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
19030 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
19040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
19050 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
19060 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
19070 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19080 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
19090 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
190a0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
190b0 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
190c0 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
190d0 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
190e0 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
190f0 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19100 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19110 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
19120 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
19130 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
19140 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
19150 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19160 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
19170 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19180 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
19190 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
191a0 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
191b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
191c0 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
191d0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
191e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
191f0 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
19200 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
19210 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19220 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
19230 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
19240 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
19250 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
19260 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
19270 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
19280 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
19290 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
192a0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
192b0 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
192c0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
192d0 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
192e0 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
192f0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
19300 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
19310 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
19320 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
19330 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
19340 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
19350 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
19360 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
19370 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
19380 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
19390 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
193a0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
193b0 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
193c0 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
193d0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
193e0 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
193f0 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
19400 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
19410 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
19420 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
19430 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
19440 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
19450 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
19460 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
19470 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
19480 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
19490 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
194a0 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
194b0 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
194c0 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
194d0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
194e0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
194f0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
19500 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
19510 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
19520 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
19530 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
19540 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
19550 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
19560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19570 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
19580 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
19590 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
195a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
195b0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
195c0 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
195d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
195e0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
195f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19600 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
19610 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19620 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
19630 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19640 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
19650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19660 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
19670 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
19680 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19690 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
196a0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
196b0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
196c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
196d0 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
196e0 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
196f0 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
19700 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
19710 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19720 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
19730 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
19740 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
19750 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
19760 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
19770 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
19780 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
19790 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
197a0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
197b0 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
197c0 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
197d0 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
197e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
197f0 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
19800 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
19810 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
19820 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
19830 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
19840 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
19850 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
19860 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Size);.        i
19870 66 28 20 6e 65 77 53 69 7a 65 3c 70 50 61 67 65  f( newSize<pPage
19880 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 29 7b 0a  r->nMapValid ){.
19890 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
198a0 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 3d 20 6e 65  ->nMapValid = ne
198b0 77 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  wSize;.        }
198c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
198d0 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a   (currentSize+sz
198e0 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29  Page)<=newSize )
198f0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
19900 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70  pTmp = pPager->p
19910 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
19920 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30    memset(pTmp, 0
19930 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  , szPage);.     
19940 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
19950 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d  wSize-szPage) ==
19960 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
19970 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19980 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
19990 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a  e) >  currentSiz
199a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e );.        rc 
199b0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
199c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d  (pPager->fd, pTm
199d0 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69  p, szPage, newSi
199e0 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  ze-szPage);.    
199f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
19a00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19a10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
19a20 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
19a30 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
19a40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19a60 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65  n a sanitized ve
19a70 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63  rsion of the sec
19a80 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66  tor-size of OS f
19a90 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a  ile pFile. The.*
19aa0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
19ab0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
19ac0 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61  lie between 32 a
19ad0 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  nd MAX_SECTOR_SI
19ae0 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ZE..*/.int sqlit
19af0 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  e3SectorSize(sql
19b00 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
19b10 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20  ){.  int iRet = 
19b20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
19b30 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ize(pFile);.  if
19b40 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20  ( iRet<32 ){.   
19b50 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d   iRet = 512;.  }
19b60 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41  else if( iRet>MA
19b70 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
19b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
19b90 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
19ba0 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 );.    iRet = 
19bb0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
19bc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
19bd0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  et;.}../*.** Set
19be0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
19bf0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
19c00 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20  ze variable for 
19c10 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67  the given.** pag
19c20 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
19c30 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
19c40 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
19c50 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
19c60 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
19c70 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f   file. The secto
19c80 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75  r size will be u
19c90 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20  sed used .** to 
19ca0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
19cb0 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
19cc0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
19cd0 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
19ce0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
19cf0 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
19d00 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
19d10 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
19d20 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
19d30 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
19d40 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
19d50 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
19d60 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
19d70 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
19d80 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
19d90 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
19da0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
19db0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
19dc0 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
19dd0 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
19de0 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
19df0 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
19e00 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
19e10 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19e20 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
19e30 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
19e40 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a  CTOR_SIZE..**.**
19e50 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
19e60 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
19e70 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
19e80 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20  WRITE property, 
19e90 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20  then set.** the 
19ea0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
19eb0 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e   size to its min
19ec0 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29  imum value (512)
19ed0 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
19ee0 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63  f.** pPager->sec
19ef0 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65  torSize is to de
19f00 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20  fine the "blast 
19f10 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73  radius" of bytes
19f20 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
19f30 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68  hange if a crash
19f40 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72   occurs while wr
19f50 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  iting to a singl
19f60 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61  e byte in.** tha
19f70 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69  t range.  But wi
19f80 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  th POWERSAFE_OVE
19f90 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73  RWRITE, the blas
19fa0 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f  t radius is zero
19fb0 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61  .** (that is wha
19fc0 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  t POWERSAFE_OVER
19fd0 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f  WRITE means), so
19fe0 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   we minimize the
19ff0 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e   sector.** size.
1a000 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20    For backwards 
1a010 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66  compatibility of
1a020 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1a030 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1a040 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20  t,.** we cannot 
1a050 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1a060 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a070 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73   below 512..*/.s
1a080 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
1a090 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
1a0a0 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
1a0b0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1a0c0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1a0d0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
1a0e0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1a0f0 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69  File.   || (sqli
1a100 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1a110 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1a120 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20  r->fd) & .      
1a130 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1a140 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a150 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29  VERWRITE)!=0.  )
1a160 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
1a170 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
1a180 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
1a190 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
1a1a0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
1a1b0 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
1a1c0 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
1a1d0 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
1a1e0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1a1f0 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
1a200 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20  egfault. */.    
1a210 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a220 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  ze = 512;.  }els
1a230 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
1a240 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
1a250 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50  te3SectorSize(pP
1a260 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d  ager->fd);.  }.}
1a270 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1a280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1a290 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
1a2a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a2b0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
1a2c0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
1a2d0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
1a2e0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
1a2f0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1a300 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1a310 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
1a320 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
1a330 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
1a340 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
1a350 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
1a360 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a370 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a380 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
1a390 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
1a3a0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
1a3b0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
1a3c0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
1a3d0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
1a3e0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
1a3f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
1a400 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
1a410 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
1a420 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
1a430 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a440 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
1a450 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
1a460 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
1a470 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
1a480 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
1a490 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a4a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1a4b0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
1a4c0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
1a4d0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
1a4e0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
1a4f0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
1a500 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a510 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
1a520 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
1a530 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1a540 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1a550 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1a560 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1a570 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a580 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1a590 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1a5a0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1a5b0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1a5c0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1a5d0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1a5e0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1a5f0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1a600 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1a610 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1a620 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1a630 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a640 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1a650 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1a660 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1a670 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1a680 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1a690 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1a6a0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1a6b0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1a6c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1a6d0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1a6e0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1a6f0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1a700 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1a710 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1a720 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1a730 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1a740 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1a750 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1a760 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1a770 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1a780 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1a790 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1a7a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a7b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1a7c0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1a7d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1a7e0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1a7f0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1a800 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1a810 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1a820 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1a830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a840 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1a850 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1a860 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1a870 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1a880 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1a890 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1a8a0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1a8b0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1a8c0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1a8d0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1a8e0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1a8f0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1a900 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1a910 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1a920 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1a930 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1a940 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1a950 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1a960 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1a970 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1a980 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1a990 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1a9a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1a9b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1a9c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1a9d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1a9e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1a9f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1aa00 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1aa10 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1aa20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1aa30 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1aa40 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1aa50 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1aa60 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1aa70 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1aa80 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1aa90 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1aaa0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1aab0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1aac0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1aad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1aae0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1aaf0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1ab00 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1ab10 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1ab20 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1ab30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1ab40 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1ab50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1ab60 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1ab70 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1ab80 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1ab90 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1aba0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1abb0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1abc0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1abd0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1abe0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1abf0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1ac00 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1ac10 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1ac20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1ac30 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1ac40 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1ac50 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1ac60 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1ac70 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1ac80 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1ac90 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1aca0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1acb0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1acc0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1acd0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1ace0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1acf0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1ad00 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1ad10 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1ad20 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1ad30 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1ad40 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1ad50 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1ad60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1ad70 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1ad80 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1ad90 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1ada0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1adb0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1adc0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1add0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1ade0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1adf0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae10 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1ae20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1ae30 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1ae40 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1ae50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ae60 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1ae70 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1ae80 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1ae90 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1aea0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1aeb0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1aec0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1aed0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1aee0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1aef0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af10 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1af20 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1af30 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af50 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1af60 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1af70 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1af80 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1af90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1afa0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1afb0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1afc0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1afd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1afe0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1aff0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1b000 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1b010 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b020 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b030 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b040 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b050 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b060 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b070 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b080 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b090 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b0a0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b0b0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b0c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b0d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b0e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b0f0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1b100 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b110 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1b120 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1b130 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1b140 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b150 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1b160 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1b170 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1b180 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1b190 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1b1a0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1b1b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1b1c0 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1b1d0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1b1e0 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1b1f0 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1b200 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1b210 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1b220 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1b230 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1b240 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1b250 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1b260 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1b270 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1b280 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1b290 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b2a0 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1b2b0 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1b2c0 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1b2d0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1b2e0 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1b2f0 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1b300 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1b310 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1b320 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1b330 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1b340 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1b350 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1b360 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1b370 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1b380 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1b390 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1b3a0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1b3b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1b3c0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1b3d0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1b3e0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1b3f0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1b400 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1b410 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1b420 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b430 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1b440 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b450 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1b460 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1b470 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1b480 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1b490 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1b4a0 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1b4b0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1b4c0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1b4d0 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1b4e0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1b4f0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1b500 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1b510 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1b520 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1b530 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b550 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b560 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b570 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b590 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b5a0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b5b0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b5c0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b5d0 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b5e0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b5f0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b600 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b610 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b620 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b640 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b650 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b660 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b670 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b690 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b6a0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b6b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b6c0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b6d0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b6e0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b6f0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b700 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b710 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b720 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b730 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b740 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1b750 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1b760 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1b770 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1b780 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1b790 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1b7a0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1b7b0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1b7c0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1b7d0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1b7e0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1b7f0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1b800 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1b810 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1b820 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b830 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b840 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b850 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1b860 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b870 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1b880 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1b890 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b8a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b8b0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1b8c0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1b8d0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1b8e0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1b8f0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b900 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b910 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b920 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b930 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b940 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b950 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b960 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1b970 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1b980 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1b990 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1b9a0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1b9b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1b9c0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1b9d0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1b9e0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1b9f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ba00 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1ba10 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1ba20 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1ba30 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1ba40 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1ba50 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1ba60 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1ba70 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1ba80 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1ba90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1baa0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1bab0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1bac0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1bad0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1bae0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1baf0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1bb00 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1bb10 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1bb20 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1bb30 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1bb40 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1bb50 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1bb60 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1bb70 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1bb80 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1bb90 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1bba0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1bbb0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1bbc0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1bbd0 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1bbe0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bbf0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1bc00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bc10 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1bc20 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1bc30 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1bc40 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1bc50 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bc60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bc70 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1bc80 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bc90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bca0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1bcb0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1bcc0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bcd0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1bce0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bcf0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1bd00 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1bd10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1bd20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bd30 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bd40 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1bd50 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1bd60 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1bd70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1bd80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bd90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bda0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1bdb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1bdc0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1bdd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1bde0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1bdf0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1be00 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1be10 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1be20 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1be30 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1be40 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1be50 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1be60 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1be70 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1be80 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1be90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1bea0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1beb0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1bec0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1bed0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1bee0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1bef0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1bf00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1bf10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bf20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1bf30 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1bf40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1bf50 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1bf60 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1bf70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1bf80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1bf90 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1bfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1bfb0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1bfc0 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1bfd0 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1bfe0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1bff0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1c000 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1c010 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1c020 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1c030 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1c040 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1c050 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1c060 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1c070 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1c080 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1c090 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1c0a0 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1c0b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1c0c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1c0d0 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1c0e0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1c0f0 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1c100 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1c110 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c120 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1c130 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c140 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1c150 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1c160 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1c170 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1c180 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1c190 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1c1a0 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1c1b0 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1c1c0 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1c1d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1c1e0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1c1f0 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1c200 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1c210 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1c220 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1c230 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1c240 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1c250 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1c260 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1c270 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1c280 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1c290 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1c2a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c2b0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1c2c0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1c2d0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1c2e0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1c2f0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1c300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c310 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1c320 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1c330 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1c340 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1c350 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1c360 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1c370 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1c380 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1c390 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1c3a0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1c3b0 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1c3c0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1c3d0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1c3e0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1c3f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c400 42 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72  BUG.  if( pPager
1c410 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1c420 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  {.    sqlite3OsF
1c430 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
1c440 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
1c450 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1c460 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  GED,0);.  }.#end
1c470 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  if..  /* If this
1c480 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
1c490 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
1c4a0 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
1c4b0 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
1c4c0 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
1c4d0 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
1c4e0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
1c4f0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
1c500 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
1c510 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
1c520 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
1c530 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
1c540 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
1c550 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
1c560 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
1c570 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
1c580 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
1c590 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
1c5a0 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
1c5b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
1c5c0 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
1c5d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
1c5e0 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
1c5f0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
1c600 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
1c610 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
1c620 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
1c630 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
1c640 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
1c650 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
1c660 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1c670 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
1c680 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
1c690 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
1c6a0 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
1c6b0 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
1c6c0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
1c6d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
1c6e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
1c6f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1c700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
1c710 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1c720 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
1c730 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1c740 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1c750 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1c760 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1c770 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
1c780 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c790 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1c7a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
1c7b0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1c7c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1c7d0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1c7e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1c7f0 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20  R_OPEN).  ){.   
1c800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c810 65 72 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0a  erSync(pPager);.
1c820 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c840 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1c850 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1c860 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1c870 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  0', 0);.    test
1c880 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c890 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1c8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c8b0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1c8c0 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1c8d0 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1c8e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1c8f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1c900 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1c910 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1c920 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1c930 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1c940 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1c950 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1c960 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1c970 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1c980 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1c990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1c9a0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1c9b0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1c9c0 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1c9d0 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1c9e0 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1c9f0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1ca00 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1ca10 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1ca20 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1ca30 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1ca40 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1ca50 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1ca60 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1ca70 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1ca80 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1ca90 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1caa0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1cab0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1cac0 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1cad0 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
1cae0 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1caf0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1cb00 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1cb10 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1cb20 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1cb30 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1cb40 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1cb50 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1cb60 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1cb70 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1cb80 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1cb90 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1cba0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1cbb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1cbc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1cbd0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1cbe0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1cbf0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1cc00 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1cc10 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1cc20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1cc30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1cc40 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1cc50 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1cc60 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1cc70 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1cc80 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1cc90 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1cca0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1ccb0 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
1ccc0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1ccd0 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1cce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1ccf0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1cd00 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1cd10 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20   isInWal = 0;   
1cd20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1cd30 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20  e if page is in 
1cd40 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  log file */.  in
1cd50 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d  t pgsz = pPager-
1cd60 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75  >pageSize; /* Nu
1cd70 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1cd80 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
1cd90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1cda0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1cdb0 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1cdc0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1cdd0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
1cde0 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
1cdf0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
1ce00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ce10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1ce20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
1ce30 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
1ce40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1ce50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ce60 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
1ce70 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1ce80 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
1ce90 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1cea0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1ceb0 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1cec0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ced0 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d  3WalRead(pPager-
1cee0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73  >pWal, pgno, &is
1cef0 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67  InWal, pgsz, pPg
1cf00 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
1cf10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cf20 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b  K && !isInWal ){
1cf30 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1cf40 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1cf50 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1cf60 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
1cf70 72 2d 3e 70 4d 61 70 20 26 26 20 70 50 61 67 65  r->pMap && pPage
1cf80 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 3e 3d 69 4f  r->nMapValid>=iO
1cf90 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61  ffset+pPager->pa
1cfa0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
1cfb0 6d 65 6d 63 70 79 28 70 50 67 2d 3e 70 44 61 74  memcpy(pPg->pDat
1cfc0 61 2c 20 26 28 28 75 38 20 2a 29 28 70 50 61 67  a, &((u8 *)(pPag
1cfd0 65 72 2d 3e 70 4d 61 70 29 29 5b 69 4f 66 66 73  er->pMap))[iOffs
1cfe0 65 74 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  et], pPager->pag
1cff0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  eSize);.    }els
1d000 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1d010 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1d020 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
1d030 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65  ta, pgsz, iOffse
1d040 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1d050 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1d060 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1d070 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d080 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1d090 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67   }.  }..  if( pg
1d0a0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  no==1 ){.    if(
1d0b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
1d0c0 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75  If the read is u
1d0d0 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74  nsuccessful, set
1d0e0 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b   the dbFileVers[
1d0f0 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20  ] to something. 
1d100 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c       ** that wil
1d110 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c  l never be a val
1d120 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e  id file version.
1d130 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69    dbFileVers[] i
1d140 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a  s a copy.      *
1d150 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33  * of bytes 24..3
1d160 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1d170 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31  e.  Bytes 28..31
1d180 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
1d190 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  e.      ** zero 
1d1a0 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
1d1b0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1d1c0 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33  age. Bytes 32..3
1d1d0 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20  5 and 35..39.   
1d1e0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
1d1f0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69  page numbers whi
1d200 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66  ch are never 0xf
1d210 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c  fffffff.  So fil
1d220 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50  ling.      ** pP
1d230 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d240 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66  [] with all 0xff
1d250 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75   bytes should su
1d260 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  ffice..      **.
1d270 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20        ** For an 
1d280 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1d290 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f  se, the situatio
1d2a0 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  n is more comple
1d2b0 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20  x:  bytes.      
1d2c0 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  ** 24..39 of the
1d2d0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68   database are wh
1d2e0 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20  ite noise.  But 
1d2f0 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
1d300 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74  of.      ** whit
1d310 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69  e noising equali
1d320 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30  ng 16 bytes of 0
1d330 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67  xff is vanishing
1d340 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20  ly small so.    
1d350 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73    ** we should s
1d360 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20  till be ok..    
1d370 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65    */.      memse
1d380 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  t(pPager->dbFile
1d390 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65  Vers, 0xff, size
1d3a0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1d3b0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c  eVers));.    }el
1d3c0 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62  se{.      u8 *db
1d3d0 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38  FileVers = &((u8
1d3e0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
1d3f0 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
1d400 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1d410 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
1d420 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1d430 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1d440 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31    }.  }.  CODEC1
1d450 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
1d460 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
1d470 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   = SQLITE_NOMEM)
1d480 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
1d490 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1d4a0 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1d4b0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1d4c0 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1d4d0 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1d4e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1d4f0 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
1d500 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E(("FETCH %d pag
1d510 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1d520 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d530 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1d540 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
1d550 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
1d560 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d570 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
1d580 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1d590 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1d5a0 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64  t offsets 24 and
1d5b0 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65   92 in.** the he
1d5c0 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c  ader and the sql
1d5d0 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1d5e0 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e  er at offset 96.
1d5f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
1d600 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  n unconditional 
1d610 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73  update.  See als
1d620 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72  o the pager_incr
1d630 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
1d640 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63  .** routine whic
1d650 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74  h only updates t
1d660 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1d670 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20  r if the update 
1d680 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e  is actually.** n
1d690 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d  eeded, as determ
1d6a0 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67  ined by the pPag
1d6b0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1d6c0 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62  one state variab
1d6d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1d6e0 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63  id pager_write_c
1d6f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48  hangecounter(PgH
1d700 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20  dr *pPg){.  u32 
1d710 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1d720 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1d730 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1d740 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1d750 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1d760 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
1d770 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
1d780 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67  et4byte((u8*)pPg
1d790 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ->pPager->dbFile
1d7a0 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32  Vers)+1;.  put32
1d7b0 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1d7c0 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
1d7d0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
1d7e0 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74   /* Also store t
1d7f0 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  he SQLite versio
1d800 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65  n number in byte
1d810 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a  s 96..99 and in.
1d820 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
1d830 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
1d840 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
1d850 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
1d860 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20   number.  ** is 
1d870 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33  valid. */.  put3
1d880 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1d890 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68  g->pData)+92, ch
1d8a0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1d8b0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1d8c0 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39  r*)pPg->pData)+9
1d8d0 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  6, SQLITE_VERSIO
1d8e0 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69  N_NUMBER);.}..#i
1d8f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d900 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_WAL./*.** This
1d910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
1d920 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  oked once for ea
1d930 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ch page that has
1d940 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a   already been .*
1d950 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  * written into t
1d960 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e  he log file when
1d970 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1d980 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1d990 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  k..** Parameter 
1d9a0 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20  iPg is the page 
1d9b0 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70  number of said p
1d9c0 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72  age. The pCtx ar
1d9d0 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63  gument .** is ac
1d9e0 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
1d9f0 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
1da00 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
1da10 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72  f page iPg is pr
1da20 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63  esent in the cac
1da30 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f  he, and has no o
1da40 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1da50 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ences,.** it is 
1da60 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72  discarded. Other
1da70 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61  wise, if there a
1da80 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
1da90 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65  utstanding.** re
1daa0 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61  ferences, the pa
1dab0 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65  ge content is re
1dac0 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
1dad0 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
1dae0 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72  .** attempt to r
1daf0 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72  eload content fr
1db00 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1db10 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20  is required and 
1db20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72  fails, .** retur
1db30 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
1db40 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
1db50 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
1db60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1db70 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f  rUndoCallback(vo
1db80 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69  id *pCtx, Pgno i
1db90 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1dba0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1dbb0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
1dbc0 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67  ger *)pCtx;.  Pg
1dbd0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67  Hdr *pPg;..  pPg
1dbe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
1dbf0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
1dc00 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
1dc10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1dc20 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
1dc30 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
1dc40 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1dc50 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
1dc60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1dc70 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1dc80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1dc90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dca0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1dcb0 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
1dcc0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1dcd0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1dce0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
1dcf0 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66   /* Normally, if
1dd00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1dd10 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  s rolled back, a
1dd20 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ny backup proces
1dd30 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64  ses are.  ** upd
1dd40 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20  ated as data is 
1dd50 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68  copied out of th
1dd60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1dd70 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a  al and into the.
1dd80 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
1dd90 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72  his is not gener
1dda0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69  ally possible wi
1ddb0 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  th a WAL databas
1ddc0 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62  e, as.  ** rollb
1ddd0 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d  ack involves sim
1dde0 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74  ply truncating t
1ddf0 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65  he log file. The
1de00 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20  refore, if one. 
1de10 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d   ** or more fram
1de20 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
1de30 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1de40 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65  the log (and the
1de50 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73  refore .  ** als
1de60 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  o copied into th
1de70 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73  e backup databas
1de80 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74  es) as part of t
1de90 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
1dea0 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70  .  ** the backup
1deb0 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72  s must be restar
1dec0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ted..  */.  sqli
1ded0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
1dee0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1def0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1df00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1df10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1df20 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  d to rollback a 
1df30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61  transaction on a
1df40 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a   WAL database..*
1df50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1df60 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61  erRollbackWal(Pa
1df70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1df80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
1dfb0 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
1dfc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dfd0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64      /* List of d
1dfe0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65  irty pages to re
1dff0 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f  vert */..  /* Fo
1e000 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74  r all pages in t
1e010 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72  he cache that ar
1e020 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  e currently dirt
1e030 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64  y or have alread
1e040 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74  y.  ** been writ
1e050 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d  ten (but not com
1e060 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c  mitted) to the l
1e070 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20  og file, do one 
1e080 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c  of the .  ** fol
1e090 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
1e0a0 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68  *   + Discard th
1e0b0 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69  e cached page (i
1e0c0 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20  f refcount==0), 
1e0d0 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f  or.  **   + Relo
1e0e0 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
1e0f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e100 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30  e (if refcount>0
1e110 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  )..  */.  pPager
1e120 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1e130 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
1e140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1e150 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
1e160 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  l, pagerUndoCall
1e170 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50  back, (void *)pP
1e180 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d  ager);.  pList =
1e190 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1e1a0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1e1b0 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c  pPCache);.  whil
1e1c0 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d  e( pList && rc==
1e1d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e1e0 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
1e1f0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
1e200 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64     rc = pagerUnd
1e210 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20  oCallback((void 
1e220 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  *)pPager, pList-
1e230 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73  >pgno);.    pLis
1e240 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  t = pNext;.  }..
1e250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e260 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e270 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
1e280 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57   around sqlite3W
1e290 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77  alFrames(). As w
1e2a0 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a  ell as logging.*
1e2b0 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
1e2c0 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  f the list of pa
1e2d0 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c  ges headed by pL
1e2e0 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ist (connected b
1e2f0 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68  y pDirty),.** th
1e300 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69  is function noti
1e310 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20  fies any active 
1e320 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
1e330 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20   that the pages 
1e340 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e  have.** changed.
1e350 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74   .**.** The list
1e360 20 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64   of pages passed
1e370 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
1e380 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72  ne is always sor
1e390 74 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62  ted by page numb
1e3a0 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66  er..** Hence, if
1e3b0 20 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20   page 1 appears 
1e3c0 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
1e3d0 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65  list, it will be
1e3e0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e   the first page.
1e3f0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
1e400 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a  pagerWalFrames(.
1e410 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1e440 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  t */.  PgHdr *pL
1e450 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1e460 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e470 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20  f frames to log 
1e480 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  */.  Pgno nTrunc
1e490 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1e4a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1e4b0 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73   size after this
1e4c0 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
1e4d0 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e4f0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1e500 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20  a commit */.){. 
1e510 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1e540 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20  */.  int nList; 
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e560 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e570 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74  f pages in pList
1e580 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1e590 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1e5a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1e5b0 43 48 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50  CHECK_PAGES).  P
1e5c0 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e5e0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1e5f0 65 72 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64  er pages */.#end
1e600 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
1e610 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20  ager->pWal );.  
1e620 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1e630 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1e640 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
1e650 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c   that the page l
1e660 69 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64  ist is in accend
1e670 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66  ing order */.  f
1e680 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26  or(p=pList; p &&
1e690 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d   p->pDirty; p=p-
1e6a0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
1e6b0 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20  sert( p->pgno < 
1e6c0 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20  p->pDirty->pgno 
1e6d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1e6e0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
1e6f0 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43  pDirty==0 || isC
1e700 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69  ommit );.  if( i
1e710 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f  sCommit ){.    /
1e720 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73  * If a WAL trans
1e730 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
1e740 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65  committed, there
1e750 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1e760 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61  writing.    ** a
1e770 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61  ny pages with pa
1e780 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1e790 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74  er than nTruncat
1e7a0 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66  e into the WAL f
1e7b0 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79  ile..    ** They
1e7c0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72   will never be r
1e7d0 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e  ead by any clien
1e7e0 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65  t. So remove the
1e7f0 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74  m from the pDirt
1e800 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65  y.    ** list he
1e810 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72  re. */.    PgHdr
1e820 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   *p;.    PgHdr *
1e830 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1e840 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b  ;.    nList = 0;
1e850 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1e860 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21  ; (*ppNext = p)!
1e870 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  =0; p=p->pDirty)
1e880 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1e890 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29  gno<=nTruncate )
1e8a0 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74  {.        ppNext
1e8b0 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20   = &p->pDirty;. 
1e8c0 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a         nList++;.
1e8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e8e0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1e8f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e900 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  nList = 1;.  }. 
1e910 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
1e920 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
1e930 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66   += nList;..  if
1e940 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
1e950 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
1e960 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
1e970 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
1e980 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
1e990 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
1e9a0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1e9b0 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
1e9c0 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
1e9d0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
1e9e0 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
1e9f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ea00 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
1ea10 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1ea20 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1ea30 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1ea40 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1ea50 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1ea60 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1ea70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1ea80 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1ea90 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1eaa0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1eab0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1eac0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1ead0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1eae0 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1eaf0 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1eb00 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1eb10 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1eb20 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1eb30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1eb40 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1eb50 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1eb60 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1eb70 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1eb80 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1eb90 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1eba0 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1ebb0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
1ebc0 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
1ebd0 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
1ebe0 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
1ebf0 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
1ec00 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
1ec10 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
1ec20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
1ec30 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
1ec40 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
1ec50 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
1ec60 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
1ec70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ec80 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
1ec90 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
1eca0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1ecb0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ecd0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1ece0 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
1ed10 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
1ed20 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
1ed30 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1ed40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ed50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1ed60 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
1ed70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1ed80 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
1ed90 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
1eda0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
1edb0 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
1edc0 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
1edd0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1ede0 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
1edf0 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
1ee00 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
1ee10 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
1ee20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
1ee30 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
1ee40 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
1ee50 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
1ee60 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
1ee70 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
1ee80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
1ee90 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1eea0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
1eeb0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1eec0 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
1eed0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1eee0 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
1eef0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1ef00 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
1ef10 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
1ef20 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
1ef30 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1ef40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1ef50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ef60 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
1ef70 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  f the transition
1ef80 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e   from PAGER_OPEN
1ef90 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41  .** to PAGER_REA
1efa0 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74  DER state to det
1efb0 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1efc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1efd0 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  file.** in pages
1efe0 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70   (assuming the p
1eff0 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74  age size current
1f000 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  ly stored in Pag
1f010 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a  er.pageSize)..**
1f020 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
1f030 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
1f040 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1f050 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
1f060 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
1f070 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64   pages is stored
1f080 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68   in *pnPage. Oth
1f090 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72  erwise, an error
1f0a0 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a   code (perhaps.*
1f0b0 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  * SQLITE_IOERR_F
1f0c0 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65  STAT) is returne
1f0d0 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  d and *pnPage is
1f0e0 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
1f0f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f100 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  pagerPagecount(P
1f110 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1f120 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50  no *pnPage){.  P
1f130 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f150 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1f160 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
1f170 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65  ..  /* Query the
1f180 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1f190 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1f1a0 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62   size. The WalDb
1f1b0 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63  size().  ** func
1f1c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72  tion returns zer
1f1d0 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20  o if the WAL is 
1f1e0 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50  not open (i.e. P
1f1f0 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f  ager.pWal==0), o
1f200 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61  r.  ** if the da
1f210 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1f220 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ot available. Th
1f230 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1f240 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69  is not.  ** avai
1f250 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1f260 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66  AL sub-system if
1f270 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73   the log file is
1f280 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63   empty or.  ** c
1f290 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64  ontains no valid
1f2a0 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73   committed trans
1f2b0 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  actions..  */.  
1f2c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f2d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f2e0 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1f2f0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1f300 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1f310 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57  nPage = sqlite3W
1f320 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d  alDbsize(pPager-
1f330 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66  >pWal);..  /* If
1f340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f350 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c  ze was not avail
1f360 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1f370 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20  L sub-system,.  
1f380 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20  ** determine it 
1f390 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a  based on the siz
1f3a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f3b0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73  e file. If the s
1f3c0 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ize.  ** of the 
1f3d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1f3e0 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
1f3f0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
1f400 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20  page-size,.  ** 
1f410 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68  round down to th
1f420 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20  e nearest page. 
1f430 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65  Except, any file
1f440 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20   larger than 0. 
1f450 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
1f460 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  e is considered 
1f470 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  to contain at le
1f480 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20  ast one page..  
1f490 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
1f4a0 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d  0 ){.    i64 n =
1f4b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f4c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1f4d0 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74  f db file in byt
1f4e0 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  es */.    assert
1f4f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1f500 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1f510 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1f520 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1f530 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
1f540 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1f550 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1f560 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20  r->fd, &n);.    
1f570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f590 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f5a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67  }.    }.    nPag
1f5b0 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50  e = (Pgno)((n+pP
1f5c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31  ager->pageSize-1
1f5d0 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) / pPager->page
1f5e0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
1f5f0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1f600 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1f610 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  in the file is g
1f620 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a  reater than the.
1f630 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20    ** configured 
1f640 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75  maximum pager nu
1f650 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74  mber, increase t
1f660 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74  he allowed limit
1f670 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
1f680 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65  e file can be re
1f690 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ad..  */.  if( n
1f6a0 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50  Page>pPager->mxP
1f6b0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
1f6c0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e  r->mxPgno = (Pgn
1f6d0 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  o)nPage;.  }..  
1f6e0 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  *pnPage = nPage;
1f6f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f700 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
1f710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1f720 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
1f730 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68  he *-wal file th
1f740 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
1f750 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
1f760 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a  pened by pPager.
1f770 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65  ** exists if the
1f780 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
1f790 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79   empy, or verify
1f7a0 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20   that the *-wal 
1f7b0 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
1f7c0 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74   exist (by delet
1f7d0 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64  ing it) if the d
1f7e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1f7f0 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
1f800 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f810 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68  not empty and th
1f820 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  e *-wal file exi
1f830 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61  sts, open the pa
1f840 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f  ger.** in WAL mo
1f850 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  de.  If the data
1f860 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72  base is empty or
1f870 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c   if no *-wal fil
1f880 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20  e exists and.** 
1f890 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
1f8a0 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61  rs, make sure Pa
1f8b0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
1f8c0 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a  is not set to.**
1f8d0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1f8e0 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65  DE_WAL..**.** Re
1f8f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1f900 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  r an error code.
1f910 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1f920 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48  r must hold a SH
1f930 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
1f940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1f950 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66  o call this.** f
1f960 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65  unction. Because
1f970 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1f980 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  ck on the db fil
1f990 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  e is required to
1f9a0 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41   delete .** a WA
1f9b0 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74  L on a none-empt
1f9c0 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73  y database, this
1f9d0 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69   ensures there i
1f9e0 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74  s no race condit
1f9f0 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ion .** between 
1fa00 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65  the xAccess() be
1fa10 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65  low and an xDele
1fa20 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75  te() being execu
1fa30 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20  ted by some .** 
1fa40 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
1fa50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fa60 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
1fa70 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61  esent(Pager *pPa
1fa80 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
1fa90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1faa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1fab0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1fac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1fad0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1fae0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  RED_LOCK );..  i
1faf0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
1fb00 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
1fb10 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  isWal;          
1fb20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1fb30 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78  e if WAL file ex
1fb40 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ists */.    Pgno
1fb50 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1fb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1fb70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1fb80 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72  e file */..    r
1fb90 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
1fba0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
1fbb0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1fbc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fbd0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1fbe0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fbf0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
1fc00 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
1fc10 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  >zWal, 0);.     
1fc20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fc30 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
1fc40 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NT ) rc = SQLITE
1fc50 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c  _OK;.      isWal
1fc60 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1fc70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1fc80 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
1fc90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1fca0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
1fcb0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1fcc0 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a  _EXISTS, &isWal.
1fcd0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1fce0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fcf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1fd00 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
1fd10 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
1fd20 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
1fd30 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
1fd40 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  che)==0 );.     
1fd50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fd60 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
1fd70 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  er, 0);.      }e
1fd80 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1fd90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
1fda0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
1fdb0 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AL ){.        pP
1fdc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1fdd0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
1fde0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20  LMODE_DELETE;.  
1fdf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fe00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1fe10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  endif../*.** Pla
1fe20 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
1fe30 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
1fe40 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
1fe50 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
1fe60 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
1fe70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1fe80 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
1fe90 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
1fea0 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
1feb0 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
1fec0 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
1fed0 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
1fee0 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
1fef0 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
1ff00 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
1ff10 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
1ff20 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
1ff30 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
1ff40 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
1ff50 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
1ff60 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
1ff70 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
1ff80 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
1ff90 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
1ffa0 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
1ffb0 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
1ffc0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1ffd0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
1ffe0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
1fff0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
20000 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
20010 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
20020 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
20030 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
20040 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
20050 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
20060 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
20070 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20080 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
20090 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
200a0 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
200b0 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
200c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
200d0 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
200e0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
200f0 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
20100 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
20110 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
20120 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
20130 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
20140 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
20150 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20160 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
20170 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20180 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
20190 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
201a0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
201b0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
201c0 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
201d0 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
201e0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
201f0 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
20200 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
20210 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
20220 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
20230 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
20240 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
20250 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
20260 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
20270 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
20280 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
20290 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
202a0 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
202b0 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
202c0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
202d0 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
202e0 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
202f0 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
20300 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
20310 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
20320 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
20330 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
20340 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
20350 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
20360 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
20370 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
20380 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
20390 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
203a0 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
203b0 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
203c0 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
203d0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
203e0 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
203f0 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
20400 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
20410 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
20420 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
20430 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
20440 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
20450 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
20460 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
20470 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
20480 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
20490 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
204a0 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
204b0 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
204c0 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
204d0 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
204e0 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
204f0 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
20500 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
20510 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
20520 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
20530 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
20540 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
20550 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
20560 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
20570 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
20580 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
20590 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
205a0 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
205b0 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
205c0 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
205d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
205e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
205f0 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
20600 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
20610 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
20620 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
20630 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
20640 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
20650 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
20660 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
20670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20680 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
20690 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
206a0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
206b0 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
206c0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
206d0 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
206e0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
206f0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
20700 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
20710 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
20720 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
20730 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
20740 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20750 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
20760 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
20770 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
20780 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
20790 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
207a0 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
207b0 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
207c0 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
207d0 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
207e0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
207f0 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
20800 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
20810 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
20820 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
20830 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
20840 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
20850 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
20860 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
20870 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
20880 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
20890 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
208a0 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
208b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
208c0 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
208d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
208e0 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
208f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
20900 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
20910 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
20920 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
20930 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
20940 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
20950 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
20960 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
20970 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
20980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20990 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
209a0 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
209b0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
209c0 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
209d0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
209e0 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
209f0 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
20a00 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
20a10 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
20a20 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
20a30 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
20a40 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20a50 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
20a60 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
20a70 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
20a80 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
20a90 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
20aa0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20ab0 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
20ac0 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
20ad0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
20ae0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
20af0 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
20b00 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
20b10 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
20b20 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
20b30 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
20b40 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
20b50 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
20b60 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
20b70 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
20b80 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
20b90 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20ba0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
20bb0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20bc0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
20bd0 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
20be0 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
20bf0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
20c00 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
20c10 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
20c20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
20c30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
20c40 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
20c50 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20c60 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20c70 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
20c80 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
20c90 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
20ca0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
20cb0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
20cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
20cd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20ce0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
20cf0 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
20d00 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
20d10 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20d20 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
20d30 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
20d40 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
20d50 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
20d60 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
20d70 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
20d80 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20d90 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
20da0 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
20db0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
20dc0 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
20dd0 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
20de0 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
20df0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
20e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20e20 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
20e30 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
20e40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20e50 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
20e60 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
20e70 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
20e80 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
20e90 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
20ea0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
20eb0 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
20ec0 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
20ed0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
20ee0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
20ef0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
20f00 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
20f10 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
20f20 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
20f30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
20f40 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
20f50 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
20f60 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
20f70 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
20f80 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
20f90 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
20fa0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
20fb0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
20fc0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
20fd0 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
20fe0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
20ff0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
21000 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
21010 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
21020 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
21030 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
21040 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
21050 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
21060 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
21070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
21080 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
21090 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
210a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
210b0 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
210c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
210d0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
210e0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
210f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21100 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
21110 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21120 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21130 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
21140 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
21150 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
21160 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
21170 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
21180 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
21190 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
211a0 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
211b0 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
211c0 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
211d0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
211e0 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
211f0 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
21200 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
21210 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
21220 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
21230 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
21240 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21250 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
21260 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
21270 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
21280 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
21290 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e  = (i64)pSavepoin
212a0 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
212b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
212c0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
212d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
212e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
212f0 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
21300 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
21310 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57  , pSavepoint->aW
21320 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  alData);.    }. 
21330 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70     for(ii=pSavep
21340 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72  oint->iSubRec; r
21350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21360 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  ii<pPager->nSubR
21370 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
21380 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d   assert( offset=
21390 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67  =(i64)ii*(4+pPag
213a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
213b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
213c0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
213d0 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
213e0 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
213f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
21400 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21410 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
21420 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
21430 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
21440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21450 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
21460 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
21470 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
21480 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
21490 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
214a0 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
214b0 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
214c0 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
214d0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
214e0 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
214f0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
21500 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
21510 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
21520 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
21530 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
21540 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
21550 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
21560 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
21570 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
21580 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
21590 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
215a0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
215b0 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
215c0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
215d0 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
215e0 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
215f0 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
21600 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
21610 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
21620 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
21630 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
21640 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
21650 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
21660 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
21670 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
21680 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
21690 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
216a0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
216b0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
216c0 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
216d0 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
216e0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
216f0 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
21700 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
21710 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
21720 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
21730 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
21740 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
21750 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21760 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
21770 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
21780 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
21790 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
217a0 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
217b0 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
217c0 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
217d0 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
217e0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
217f0 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
21800 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
21810 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
21820 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
21830 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
21840 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
21850 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
21860 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
21870 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
21880 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
21890 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
218a0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
218b0 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
218c0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
218d0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
218e0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
218f0 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
21900 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
21910 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
21920 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
21930 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
21940 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
21950 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
21960 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
21980 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
21990 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
219a0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
219b0 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
219c0 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
219d0 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
219e0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
219f0 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
21a00 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
21a10 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
21a20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
21a30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21a40 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
21a50 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
21a60 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
21a70 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
21a80 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72  The above is for
21a90 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72   a rollback-jour
21aa0 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57  nal mode.  For W
21ab0 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e  AL mode, OFF con
21ac0 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61  tinues.** to mea
21ad0 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20  n that no syncs 
21ae0 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52  ever occur.  NOR
21af0 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  MAL means that t
21b00 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64  he WAL is synced
21b10 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65  .** prior to the
21b20 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70   start of checkp
21b30 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68  oint and that th
21b40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21b50 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20  is synced.** at 
21b60 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
21b70 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  f the checkpoint
21b80 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63   if the entire c
21b90 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41  ontent of the WA
21ba0 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e  L.** was written
21bb0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
21bc0 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f  atabase.  But no
21bd0 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73   sync operations
21be0 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e   occur for.** an
21bf0 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74   ordinary commit
21c00 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20   in NORMAL mode 
21c10 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20  with WAL.  FULL 
21c20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
21c30 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79  AL.** file is sy
21c40 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  nced following e
21c50 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61  ach commit opera
21c60 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f  tion, in additio
21c70 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63  n to the.** sync
21c80 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21c90 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20  h NORMAL..**.** 
21ca0 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73  Do not confuse s
21cb0 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
21cc0 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43  with SQLITE_SYNC
21cd0 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53  _FULL.  The.** S
21ce0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
21cf0 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75  macro means to u
21d00 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74  se the MacOSX-st
21d10 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a  yle full-fsync.*
21d20 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f  * using fcntl(F_
21d30 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c  FULLFSYNC).  SQL
21d40 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
21d50 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a  means to do an.*
21d60 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63  * ordinary fsync
21d70 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20  () call.  There 
21d80 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
21d90 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f   between SQLITE_
21da0 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64  SYNC_FULL.** and
21db0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
21dc0 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73  MAL on platforms
21dd0 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f   other than MacO
21de0 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20  SX.  But the.** 
21df0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
21e00 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e   versus synchron
21e10 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69  ous=NORMAL setti
21e20 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ng determines wh
21e30 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20  en.** the xSync 
21e40 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c  primitive is cal
21e50 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76  led and is relev
21e60 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66  ant to all platf
21e70 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  orms..**.** Nume
21e80 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
21e90 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
21ea0 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
21eb0 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
21ec0 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
21ed0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21ee0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
21ef0 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
21f00 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
21f10 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  l(.  Pager *pPag
21f20 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
21f30 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
21f40 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
21f50 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20  */.  int level, 
21f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52             /* PR
21f70 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
21f80 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d  .  1=OFF, 2=NORM
21f90 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a  AL, 3=FULL */  .
21fa0 20 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63    int bFullFsync
21fb0 2c 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d  ,       /* PRAGM
21fc0 41 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20  A fullfsync */. 
21fd0 20 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c 46 73   int bCkptFullFs
21fe0 79 6e 63 20 20 20 20 2f 2a 20 50 52 41 47 4d 41  ync    /* PRAGMA
21ff0 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
22000 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73  fsync */.){.  as
22010 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26  sert( level>=1 &
22020 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20  & level<=3 );.  
22030 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22040 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
22050 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
22060 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
22070 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
22080 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
22090 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
220a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
220b0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  noSync ){.    pP
220c0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
220d0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
220e0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
220f0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
22100 62 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20  bFullFsync ){.  
22110 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22120 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22130 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67  C_FULL;.    pPag
22140 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
22150 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22160 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  FULL;.  }else if
22170 28 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63  ( bCkptFullFsync
22180 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22190 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
221a0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
221b0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
221c0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
221d0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
221e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
221f0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
22200 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22210 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
22220 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
22230 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22240 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  L;.  }.  pPager-
22250 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
22260 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22270 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  s;.  if( pPager-
22280 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
22290 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
222a0 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e  Flags |= WAL_SYN
222b0 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
222c0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
222d0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
222e0 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
222f0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
22300 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
22310 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
22320 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
22330 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
22340 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
22350 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
22360 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22370 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
22380 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22390 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
223a0 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
223b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
223c0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
223d0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
223e0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
223f0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
22400 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
22410 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
22420 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
22430 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
22440 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
22450 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
22460 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
22470 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
22480 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
22490 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
224a0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
224b0 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
224c0 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
224d0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
224e0 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
224f0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
22500 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
22510 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22520 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
22530 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22540 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
22550 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
22560 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
22570 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
22580 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
22590 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
225a0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
225b0 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
225c0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
225d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
225e0 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
225f0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22600 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
22610 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
22620 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
22630 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
22640 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
22650 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22660 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22670 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
22680 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
22690 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
226a0 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
226b0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
226c0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
226d0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
226e0 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45  Flags |=  SQLITE
226f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
22700 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
22710 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
22720 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
22730 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
22740 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
22750 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
22760 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
22770 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
22780 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
22790 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
227a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
227b0 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
227c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
227d0 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
227e0 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
227f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
22800 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
22810 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
22820 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
22830 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
22840 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
22850 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
22860 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
22870 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
22880 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
22890 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
228a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
228b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
228c0 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
228d0 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
228e0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
228f0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
22900 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
22910 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
22920 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
22930 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
22940 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
22950 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
22960 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
22970 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
22980 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
229b0 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
229c0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
229d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
229e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
229f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
22a00 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
22a10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
22a20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
22a30 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
22a40 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
22a50 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
22a60 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
22a70 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
22a80 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
22a90 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
22aa0 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
22ab0 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
22ac0 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
22ad0 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
22ae0 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
22af0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
22b00 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
22b10 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
22b20 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
22b30 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
22b40 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
22b50 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
22b60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22b70 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
22b80 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
22b90 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22bb0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
22bc0 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
22bd0 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
22be0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
22bf0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
22c00 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
22c10 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
22c20 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
22c30 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
22c40 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
22c50 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20  yHandler */.){. 
22c60 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
22c70 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
22c80 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
22c90 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
22ca0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
22cb0 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  g;..  if( isOpen
22cc0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
22cd0 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20      void **ap = 
22ce0 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72  (void **)&pPager
22cf0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->xBusyHandler;.
22d00 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69 6e      assert( ((in
22d10 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70  t(*)(void *))(ap
22d20 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64  [0]))==xBusyHand
22d30 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ler );.    asser
22d40 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48  t( ap[1]==pBusyH
22d50 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20  andlerArg );.   
22d60 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
22d70 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
22d80 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
22d90 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20  TL_BUSYHANDLER, 
22da0 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d  (void *)ap);.  }
22db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
22dc0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
22dd0 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
22de0 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
22df0 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
22e00 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
22e10 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
22e20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
22e30 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
22e40 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
22e50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
22e60 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
22e70 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
22e80 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
22e90 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
22ea0 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
22eb0 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
22ec0 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
22ed0 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72  _xxx sub-code or
22ee0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
22ef0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
22f00 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
22f10 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
22f20 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
22f30 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
22f40 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
22f50 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
22f60 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
22f70 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
22f80 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
22f90 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
22fa0 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
22fb0 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
22fc0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
22fd0 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
22fe0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
22ff0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
23000 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
23010 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
23020 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
23030 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
23040 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
23050 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
23060 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
23070 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
23080 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
23090 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
230a0 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
230b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
230c0 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
230d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
230e0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
230f0 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
23100 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
23110 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
23120 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
23130 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
23140 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
23150 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
23160 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
23170 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
23180 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
23190 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
231a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
231b0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
231c0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
231d0 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
231e0 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
231f0 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
23200 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
23210 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
23220 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
23230 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
23240 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
23250 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
23260 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
23270 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
23280 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
23290 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
232a0 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
232b0 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
232c0 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
232d0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
232e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
232f0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
23300 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32  ger *pPager, u32
23310 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74   *pPageSize, int
23320 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
23330 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23340 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  ;..  /* It is no
23350 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f  t possible to do
23360 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70   a full assert_p
23370 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72  ager_state() her
23380 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20  e, as this.  ** 
23390 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
233a0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
233b0 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20  in PagerOpen(), 
233c0 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65  before the state
233d0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67  .  ** of the Pag
233e0 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74  er object is int
233f0 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
23400 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74  nt..  **.  ** At
23410 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
23420 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
23430 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
23440 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a  e pager was in .
23450 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
23460 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63   state. But sinc
23470 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  e PAGER_ERROR st
23480 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ate guarantees t
23490 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  hat.  ** there i
234a0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
234b0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
234c0 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20  reference, this 
234d0 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
234e0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61   a no-op for tha
234f0 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20  t case anyhow.. 
23500 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53   */..  u32 pageS
23510 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
23520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
23530 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
23540 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
23550 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
23560 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
23570 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d    if( (pPager->m
23580 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
23590 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
235a0 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
235b0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
235c0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
235d0 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26    && pageSize &&
235e0 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29   pageSize!=(u32)
235f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23600 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
23610 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20  *pNew = NULL;   
23620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23630 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20   temp space */. 
23640 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30     i64 nByte = 0
23650 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
23660 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
23670 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70  OPEN && isOpen(p
23680 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
236a0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
236b0 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a  r->fd, &nByte);.
236c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
236d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
236e0 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61       pNew = (cha
236f0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
23700 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
23710 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
23720 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
23730 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OMEM;.    }..   
23740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
23760 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
23770 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
23780 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28  bSize = (Pgno)((
23790 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31  nByte+pageSize-1
237a0 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  )/pageSize);.   
237b0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
237c0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
237d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
237e0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
237f0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
23800 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
23810 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
23820 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
23830 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
23840 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
23850 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ze);.    }.  }..
23860 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
23870 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
23880 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
238a0 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
238b0 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
238c0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
238d0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
238e0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
238f0 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
23900 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
23910 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
23920 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
23930 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
23940 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23950 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
23960 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
23970 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
23980 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
23990 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
239a0 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
239b0 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
239c0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
239d0 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
239e0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
239f0 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
23a00 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
23a10 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
23a20 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
23a30 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
23a40 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
23a50 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
23a60 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
23a70 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
23a80 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
23a90 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
23aa0 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
23ab0 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
23ac0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
23ad0 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
23ae0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
23af0 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
23b00 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
23b10 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
23b20 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
23b30 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
23b40 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
23b50 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
23b60 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
23b70 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
23b80 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
23b90 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
23ba0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
23bb0 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
23bc0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
23bd0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
23be0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
23bf0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
23c00 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
23c10 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
23c20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23c30 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
23c40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
23c50 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
23c60 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
23c70 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
23c80 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61   mxPage;.  }.  a
23c90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
23ca0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
23cb0 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c  N );      /* Cal
23cc0 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d  led only by OP_M
23cd0 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73  axPgcnt */.  ass
23ce0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
23cf0 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
23d00 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61  ize );  /* OP_Ma
23d10 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20  xPgcnt enforces 
23d20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  this */.  return
23d30 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
23d40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
23d50 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
23d60 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
23d70 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
23d80 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
23d90 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
23da0 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
23db0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
23dc0 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
23dd0 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
23de0 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
23df0 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
23e00 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
23e10 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
23e20 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
23e30 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
23e40 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
23e50 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
23e60 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
23e70 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
23e80 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
23e90 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
23ea0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
23eb0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
23ec0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
23ed0 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
23ee0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
23ef0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
23f00 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
23f10 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
23f20 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
23f30 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
23f40 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
23f50 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23f60 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
23f70 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
23f80 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
23f90 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
23fa0 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
23fb0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
23fc0 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
23fd0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23fe0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
23ff0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
24000 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
24010 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
24020 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
24030 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
24040 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
24050 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
24060 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
24070 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
24080 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
24090 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
240a0 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
240b0 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
240c0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
240d0 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
240e0 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
240f0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
24100 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
24110 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
24120 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
24130 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
24140 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
24150 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
24160 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
24170 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
24180 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
24190 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
241a0 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
241b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
241c0 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
241d0 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
241e0 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
241f0 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
24200 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
24210 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
24220 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
24230 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
24240 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
24250 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
24260 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
24270 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
24280 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
24290 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
242a0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
242b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
242c0 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
242d0 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
242e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
242f0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
24300 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
24310 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
24320 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
24330 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
24340 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
24350 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
24360 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
24370 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
24380 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
24390 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
243a0 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
243b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
243c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
243d0 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
243e0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
243f0 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
24400 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
24410 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
24420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24430 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
24440 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
24450 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24460 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
24470 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
24480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24490 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
244a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
244b0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
244c0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
244d0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
244e0 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
244f0 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
24500 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
24510 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
24520 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
24530 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
24540 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
24550 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
24560 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
24570 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
24580 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
24590 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
245a0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
245b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
245c0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
245d0 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
245e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
245f0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
24600 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
24610 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24620 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
24630 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
24640 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
24650 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
24660 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
24670 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
24680 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
24690 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
246a0 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
246b0 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
246c0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
246d0 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
246e0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
246f0 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
24700 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
24710 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
24720 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
24730 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
24740 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
24750 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
24760 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
24770 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
24780 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
24790 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
247a0 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
247b0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
247c0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
247d0 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
247e0 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
247f0 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
24800 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
24810 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
24820 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
24830 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
24840 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
24850 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
24860 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
24870 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
24880 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
24890 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
248a0 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
248b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
248c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
248d0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
248e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
248f0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
24900 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24920 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
24930 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
24940 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
24950 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
24960 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
24970 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
24980 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
24990 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
249a0 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
249b0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
249c0 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
249d0 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
249e0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
249f0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
24a00 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
24a10 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
24a20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
24a30 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
24a40 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
24a50 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
24a60 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
24a70 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
24a80 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
24a90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
24aa0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
24ab0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
24ac0 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
24ad0 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
24ae0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
24af0 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
24b00 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
24b10 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
24b20 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
24b30 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
24b40 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
24b50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24b60 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
24b70 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
24b80 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
24b90 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
24ba0 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
24bb0 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
24bc0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
24bd0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
24be0 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
24bf0 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
24c00 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
24c10 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
24c20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
24c30 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
24c40 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
24c50 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
24c60 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
24c70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
24c80 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
24c90 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
24ca0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
24cb0 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
24cc0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
24cd0 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
24ce0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
24cf0 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
24d00 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
24d10 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
24d20 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
24d30 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
24d40 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
24d50 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
24d60 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
24d70 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
24d80 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
24d90 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
24da0 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
24db0 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
24dc0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
24dd0 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
24de0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
24df0 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
24e00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24e10 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
24e20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
24e30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
24e40 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
24e50 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
24e60 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64   behaviour would
24e70 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
24e80 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
24e90 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
24ea0 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
24eb0 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
24ec0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
24ed0 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
24ee0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
24ef0 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
24f00 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
24f10 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
24f20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
24f30 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
24f40 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
24f50 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
24f60 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
24f70 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
24f80 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
24f90 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
24fa0 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
24fb0 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
24fc0 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
24fd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
24fe0 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
24ff0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
25000 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
25010 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
25020 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
25030 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
25040 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
25050 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
25060 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
25070 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
25080 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
25090 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
250a0 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
250b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
250c0 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
250d0 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
250e0 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
250f0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25100 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
25110 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
25120 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
25130 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
25140 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
25150 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
25160 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
25170 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
25180 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
25190 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
251a0 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
251b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
251c0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
251d0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
251e0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
251f0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
25200 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
25210 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
25220 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
25230 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
25240 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
25250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
25260 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
25270 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25280 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
25290 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e  ansaction..** On
252a0 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ce this function
252b0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
252c0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
252d0 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65  n must either be
252e0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
252f0 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74  or committed. It
25300 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
25310 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
25320 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63  on and.** then c
25330 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20  ontinue writing 
25340 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
25350 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25360 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
25370 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
25380 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
25390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
253a0 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
253b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
253c0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
253d0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
253e0 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
253f0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a  bSize = nPage;..
25400 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
25410 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  t the code here 
25420 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75  called assertTru
25430 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25440 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65  ) to.  ** ensure
25450 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
25460 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20  being truncated 
25470 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65  away by this ope
25480 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a  ration are,.  **
25490 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
254a0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f  savepoints are o
254b0 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20  pen, present in 
254c0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
254d0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74   ** journal so t
254e0 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
254f0 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20  restored if the 
25500 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c  savepoint is rol
25510 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54  led.  ** back. T
25520 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  his is no longer
25530 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
25540 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
25550 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c  ow only.  ** cal
25560 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25570 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
25580 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c  ansaction. So al
25590 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a  though the .  **
255a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61   Pager object ma
255b0 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65  y still have ope
255c0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61  n savepoints (Pa
255d0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d  ger.nSavepoint!=
255e0 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63  0), .  ** they c
255f0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
25600 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73  back. So the ass
25610 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25620 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a  raint() call.  *
25630 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63  * is no longer c
25640 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f  orrect. */.}.../
25650 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25660 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
25670 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
25680 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
25690 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e  lback. It.** syn
256a0 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
256b0 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65  ile to disk, the
256c0 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a  n sets pPager->j
256d0 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65  ournalHdr to the
256e0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
256f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20  journal file so 
25700 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70  that the pager_p
25710 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
25720 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20  e knows.** that 
25730 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
25740 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
25750 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53   synced..**.** S
25760 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  yncing a hot-jou
25770 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66  rnal to disk bef
25780 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
25790 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65  o roll it back e
257a0 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20  nsures .** that 
257b0 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75  if a power-failu
257c0 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  re occurs during
257d0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74   the rollback, t
257e0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a  he process that.
257f0 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c  ** attempts roll
25800 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73  back following s
25810 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73  ystem recovery s
25820 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75  ees the same jou
25830 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rnal.** content 
25840 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  as this process.
25850 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
25860 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61  hing goes as pla
25870 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  nned, SQLITE_OK 
25880 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
25890 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53  erwise, .** an S
258a0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
258b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
258c0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
258d0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
258e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
258f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
25900 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
25910 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
25920 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
25930 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
25940 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a  NC_NORMAL);.  }.
25950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25960 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
25970 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
25980 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
25990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
259a0 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
259b0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 6e 63 6c 75 64  n rc;.}..#includ
259c0 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a  e <sys/mman.h>..
259d0 2f 2a 0a 2a 2a 20 55 6e 6d 61 70 20 61 6e 79 20  /*.** Unmap any 
259e0 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65 20 64  mapping of the d
259f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
25a00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
25a10 72 55 6e 6d 61 70 28 50 61 67 65 72 20 2a 70 50  rUnmap(Pager *pP
25a20 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
25a30 67 65 72 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20  ger->pMap ){.   
25a40 20 6d 75 6e 6d 61 70 28 70 50 61 67 65 72 2d 3e   munmap(pPager->
25a50 70 4d 61 70 2c 20 70 50 61 67 65 72 2d 3e 6e 4d  pMap, pPager->nM
25a60 61 70 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ap);.    pPager-
25a70 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20 20 20 70  >pMap = 0;.    p
25a80 50 61 67 65 72 2d 3e 6e 4d 61 70 20 3d 20 30 3b  Pager->nMap = 0;
25a90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61  .    pPager->nMa
25aa0 70 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  pValid = 0;.  }.
25ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25ac0 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
25ad0 74 20 70 61 67 65 72 4d 61 70 28 50 61 67 65 72  t pagerMap(Pager
25ae0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
25af0 20 72 63 3b 0a 20 20 69 36 34 20 73 7a 20 3d 20   rc;.  i64 sz = 
25b00 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
25b10 61 67 65 72 2d 3e 70 4d 61 70 3d 3d 30 20 26 26  ager->pMap==0 &&
25b20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 3d 3d 30   pPager->nMap==0
25b30 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
25b40 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
25b50 61 67 65 72 2d 3e 66 64 2c 20 26 73 7a 29 3b 0a  ager->fd, &sz);.
25b60 20 20 73 7a 20 3d 20 73 7a 20 26 20 7e 28 34 30    sz = sz & ~(40
25b70 39 36 2d 31 29 3b 0a 0a 20 20 69 66 28 20 72 63  96-1);..  if( rc
25b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
25b90 7a 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  z>0 ){.    int f
25ba0 64 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  d;.    rc = sqli
25bb0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
25bc0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
25bd0 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 46 44 2c  ITE_FCNTL_GETFD,
25be0 20 28 76 6f 69 64 20 2a 29 26 66 64 29 3b 0a 20   (void *)&fd);. 
25bf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
25c10 69 64 20 2a 70 4d 61 70 20 3d 20 6d 6d 61 70 28  id *pMap = mmap(
25c20 30 2c 20 73 7a 2c 20 50 52 4f 54 5f 52 45 41 44  0, sz, PROT_READ
25c30 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 4d 41 50  |PROT_WRITE, MAP
25c40 5f 53 48 41 52 45 44 2c 20 66 64 2c 20 30 29 3b  _SHARED, fd, 0);
25c50 0a 20 20 20 20 20 20 69 66 28 20 70 4d 61 70 3d  .      if( pMap=
25c60 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
25c70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
25c80 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
25c90 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
25ca0 2d 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20  ->pMap = pMap;. 
25cb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61       pPager->nMa
25cc0 70 56 61 6c 69 64 20 3d 20 70 50 61 67 65 72 2d  pValid = pPager-
25cd0 3e 6e 4d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20  >nMap = sz;.    
25ce0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
25cf0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
25d00 74 20 70 61 67 65 72 52 65 6d 61 70 28 50 61 67  t pagerRemap(Pag
25d10 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
25d20 20 6e 50 61 67 65 29 7b 0a 20 20 69 36 34 20 73   nPage){.  i64 s
25d30 7a 20 3d 20 28 69 36 34 29 6e 50 61 67 65 20 2a  z = (i64)nPage *
25d40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
25d50 65 3b 0a 20 20 73 7a 20 3d 20 73 7a 20 26 20 7e  e;.  sz = sz & ~
25d60 28 34 30 39 36 2d 31 29 3b 0a 0a 20 20 69 66 28  (4096-1);..  if(
25d70 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 21 3d 73   pPager->nMap!=s
25d80 7a 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  z ){.    void *p
25d90 4d 61 70 20 3d 20 6d 72 65 6d 61 70 28 70 50 61  Map = mremap(pPa
25da0 67 65 72 2d 3e 70 4d 61 70 2c 20 70 50 61 67 65  ger->pMap, pPage
25db0 72 2d 3e 6e 4d 61 70 2c 20 73 7a 2c 20 4d 52 45  r->nMap, sz, MRE
25dc0 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 20 20 20  MAP_MAYMOVE);   
25dd0 20 0a 20 20 20 20 69 66 28 20 70 4d 61 70 3d 3d   .    if( pMap==
25de0 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
25df0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25e00 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
25e10 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 61 70 20     pPager->pMap 
25e20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 70 50 61 67  = pMap;.    pPag
25e30 65 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 3d 20  er->nMapValid = 
25e40 70 50 61 67 65 72 2d 3e 6e 4d 61 70 20 3d 20 73  pPager->nMap = s
25e50 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  z;.  }..  return
25e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
25e70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
25e80 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 50 61  cquireMapPage(Pa
25e90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
25ea0 6f 20 70 67 6e 6f 2c 20 50 67 48 64 72 20 2a 2a  o pgno, PgHdr **
25eb0 70 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  ppPage){.  int r
25ec0 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  c;.  *ppPage = 0
25ed0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
25ee0 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a  ger->pWal==0 );.
25ef0 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20  .  if( MEMDB==0 
25f00 26 26 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  && pPager->tempF
25f10 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ile==0 ){.    if
25f20 28 20 70 50 61 67 65 72 2d 3e 70 4d 61 70 3d 3d  ( pPager->pMap==
25f30 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
25f40 70 61 67 65 72 4d 61 70 28 70 50 61 67 65 72 29  pagerMap(pPager)
25f50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25f60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
25f70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
25f80 20 20 69 66 28 20 70 67 6e 6f 21 3d 31 20 26 26    if( pgno!=1 &&
25f90 20 70 50 61 67 65 72 2d 3e 70 4d 61 70 20 0a 20   pPager->pMap . 
25fa0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6e      && pPager->n
25fb0 4d 61 70 56 61 6c 69 64 3e 3d 28 28 69 36 34 29  MapValid>=((i64)
25fc0 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67  pgno*pPager->pag
25fd0 65 53 69 7a 65 29 20 0a 20 20 20 20 29 7b 0a 20  eSize) .    ){. 
25fe0 20 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20       PgHdr *p;. 
25ff0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
26000 3e 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  >pFree ){.      
26010 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 46    p = pPager->pF
26020 72 65 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ree;.        pPa
26030 67 65 72 2d 3e 70 46 72 65 65 20 3d 20 70 2d 3e  ger->pFree = p->
26040 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
26050 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
26060 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2d         memset(p-
26070 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67  >pExtra, 0, pPag
26080 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
26090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
260a0 20 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73    p = (PgHdr *)s
260b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
260c0 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b  (sizeof(PgHdr) +
260d0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
260e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 3d  ;.        if( p=
260f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
26100 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
26110 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76    p->pExtra = (v
26120 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  oid *)&p[1];.   
26130 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
26140 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
26150 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26160 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 61 67  .        p->pPag
26170 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
26180 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
26190 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
261a0 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
261b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
261c0 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20  >pPage==0 );.   
261d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c     assert( p->fl
261e0 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20  ags==PGHDR_MMAP 
261f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26200 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67   p->pPager==pPag
26210 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
26220 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
26230 3b 0a 0a 20 20 20 20 20 20 70 2d 3e 70 44 61 74  ;..      p->pDat
26240 61 20 3d 20 26 28 28 75 38 20 2a 29 70 50 61 67  a = &((u8 *)pPag
26250 65 72 2d 3e 70 4d 61 70 29 5b 28 69 36 34 29 28  er->pMap)[(i64)(
26260 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
26270 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20  ->pageSize];.   
26280 20 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e     p->pgno = pgn
26290 6f 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  o;.      pPager-
262a0 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 20 20 20  >nMmapOut++;.   
262b0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 3b 0a     *ppPage = p;.
262c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
262d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
262e0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
262f0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26300 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
26310 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
26320 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
26330 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26340 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
26350 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 72 65  y = pPager->pFre
26360 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 72  e;.  pPager->pFr
26370 65 65 20 3d 20 70 50 67 3b 0a 7d 0a 0a 73 74 61  ee = pPg;.}..sta
26380 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
26390 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20  eeMapHdrs(Pager 
263a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
263b0 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70  r *p;.  PgHdr *p
263c0 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50  Next;.  for(p=pP
263d0 61 67 65 72 2d 3e 70 46 72 65 65 3b 20 70 3b 20  ager->pFree; p; 
263e0 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
263f0 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ext = p->pDirty;
26400 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26410 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  e(p);.  }.}.../*
26420 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
26430 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
26440 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
26450 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
26460 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
26470 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
26480 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
26490 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
264a0 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
264b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
264c0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
264d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
264e0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
264f0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
26500 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
26510 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
26520 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
26530 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
26540 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
26550 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
26560 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
26570 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
26580 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
26590 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
265a0 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
265b0 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
265c0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
265d0 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
265e0 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
265f0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
26600 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
26610 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
26620 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
26630 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
26640 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
26650 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
26660 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
26670 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
26680 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
26690 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
266a0 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
266b0 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
266c0 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74  Space;..  assert
266d0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
266e0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
266f0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
26700 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
26710 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
26720 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
26730 20 70 61 67 65 72 55 6e 6d 61 70 28 70 50 61 67   pagerUnmap(pPag
26740 65 72 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65  er);.  pagerFree
26750 4d 61 70 48 64 72 73 28 70 50 61 67 65 72 29 3b  MapHdrs(pPager);
26760 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
26770 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  rCode = 0; */.  
26780 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
26790 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eMode = 0;.#ifnd
267a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
267b0 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43  AL.  sqlite3WalC
267c0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61  lose(pPager->pWa
267d0 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  l, pPager->ckptS
267e0 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72  yncFlags, pPager
267f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70  ->pageSize, pTmp
26800 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61  );.  pPager->pWa
26810 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
26820 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
26830 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
26840 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
26850 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
26860 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
26870 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e   it is open, syn
26880 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
26890 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
268a0 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  g UnlockAndRollb
268b0 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ack..    ** If t
268c0 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c  his is not done,
268d0 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65   then an unsynce
268e0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
268f0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20   open journal . 
26900 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62     ** file may b
26910 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
26920 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
26930 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
26940 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20  ure occurs .    
26950 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73  ** while this is
26960 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
26970 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
26980 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
26990 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
269a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
269b0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
269c0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
269d0 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65  , shift the page
269e0 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  r.    ** into th
269f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54  e ERROR state. T
26a00 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63  his causes Unloc
26a10 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  kAndRollback to 
26a20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a  unlock the.    *
26a30 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  * database and c
26a40 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
26a50 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74   file without at
26a60 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
26a70 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20   it.    ** back 
26a80 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20  or finalize it. 
26a90 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73  The next databas
26aa0 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65  e user will have
26ab0 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e   to do hot-journ
26ac0 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  al.    ** rollba
26ad0 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73  ck before access
26ae0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
26af0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
26b00 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
26b10 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
26b20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
26b30 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63  Pager, pagerSync
26b40 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
26b50 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
26b60 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
26b70 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
26b80 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
26b90 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
26ba0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
26bb0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
26bc0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c   PAGERTRACE(("CL
26bd0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
26be0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
26bf0 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
26c00 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
26c10 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
26c20 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
26c30 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
26c40 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
26c50 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
26c60 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  Tmp);.  sqlite3P
26c70 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
26c80 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
26c90 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
26ca0 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67  CODEC.  if( pPag
26cb0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
26cc0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
26cd0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
26ce0 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ec);.#endif..  a
26cf0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
26d00 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
26d10 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
26d20 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
26d30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26d40 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
26d50 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
26d60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26d70 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
26d80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26d90 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
26da0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
26db0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
26dc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
26dd0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
26de0 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
26df0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
26e00 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
26e10 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
26e20 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
26e30 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
26e40 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
26e50 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
26e60 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
26e70 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
26e80 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
26e90 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
26ea0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
26eb0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
26ec0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
26ed0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
26ee0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
26ef0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
26f00 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26f10 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
26f20 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
26f30 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
26f40 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
26f50 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
26f60 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
26f70 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
26f80 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
26f90 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  noSync flag is s
26fa0 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
26fb0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
26fc0 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
26fd0 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
26fe0 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
26ff0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
27000 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76   and the .** dev
27010 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
27020 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  ics of the file-
27030 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
27040 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
27050 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27060 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
27070 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
27080 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
27090 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
270a0 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
270b0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
270c0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
270d0 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
270e0 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
270f0 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
27100 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
27110 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
27120 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
27130 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
27140 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
27150 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
27160 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
27170 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
27180 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
27190 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
271a0 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
271b0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
271c0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
271d0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
271e0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
271f0 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
27200 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
27210 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
27220 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
27230 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
27240 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
27250 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
27260 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
27270 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
27280 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
27290 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
272a0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
272b0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
272c0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
272d0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
272e0 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
272f0 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
27300 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
27310 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
27320 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
27330 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
27340 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
27350 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
27360 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
27370 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
27380 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
27390 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
273a0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
273b0 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
273c0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
273d0 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
273e0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
273f0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
27400 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
27410 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
27420 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
27430 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
27440 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
27450 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
27460 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
27470 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20  , int newHdr){. 
27480 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
274b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
274c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
274d0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
274e0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
274f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
27500 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
27510 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
27520 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
27530 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
27540 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
27550 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
27560 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
27570 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
27580 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
27590 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
275a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
275b0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
275c0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
275d0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
275e0 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
275f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27600 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
27610 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
27620 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
27630 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ORY ){.      con
27640 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
27650 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
27660 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
27670 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
27680 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
27690 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
276a0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
276b0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
276c0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
276d0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
276e0 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
276f0 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
27700 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
27710 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
27720 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
27730 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
27740 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
27750 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
27760 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
27770 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
27780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
27790 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
277a0 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
277b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
277c0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
277d0 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
277e0 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
277f0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
27800 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
27810 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
27820 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
27830 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
27840 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
27850 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27  ious connection'
27860 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
27870 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
27880 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
27890 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
278a0 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
278b0 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
278c0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
278d0 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
278e0 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
278f0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
27900 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
27910 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
27920 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
27930 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
27940 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
27950 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
27960 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
27970 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
27980 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
27990 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
279a0 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
279b0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
279c0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
279d0 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
279e0 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
279f0 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
27a00 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
27a10 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
27a20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
27a30 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
27a40 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27a50 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
27a60 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
27a70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27a80 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
27a90 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
27aa0 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
27ab0 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
27ac0 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
27ad0 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
27ae0 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
27af0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
27b00 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
27b10 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
27b20 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
27b30 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72  *.        ** Var
27b40 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66  iable iNextHdrOf
27b50 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
27b60 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69  he offset at whi
27b70 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  ch this.        
27b80 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68  ** problematic h
27b90 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72  eader will occur
27ba0 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
27bb0 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a  aMagic is used .
27bc0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20          ** as a 
27bd0 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
27be0 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20   to inspect the 
27bf0 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
27c00 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20  bytes of.       
27c10 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61   ** the potentia
27c20 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  l journal header
27c30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27c40 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64       i64 iNextHd
27c50 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  rOffset;.       
27c60 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20   u8 aMagic[8];. 
27c70 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65         u8 zHeade
27c80 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
27c90 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20  lMagic)+4];..   
27ca0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61       memcpy(zHea
27cb0 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
27cc0 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
27cd0 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
27ce0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
27cf0 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
27d00 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
27d10 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
27d20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f         iNextHdrO
27d30 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
27d40 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
27d50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
27d60 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
27d70 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
27d80 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 8, iNextHdrOff
27d90 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
27da0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27db0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61  && 0==memcmp(aMa
27dc0 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
27dd0 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
27de0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
27df0 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
27e00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
27e10 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
27e20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
27e30 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74  robyte, 1, iNext
27e40 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
27e50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
27e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27e70 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
27e80 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
27e90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
27ea0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
27eb0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ..        /* Wri
27ec0 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
27ed0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
27ee0 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
27ef0 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
27f00 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
27f10 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
27f20 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
27f30 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
27f40 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
27f50 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
27f60 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
27f70 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
27f80 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
27f90 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
27fa0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
27fb0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
27fc0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
27fd0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
27fe0 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
27ff0 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
28000 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
28010 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
28020 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
28030 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
28040 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
28050 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
28060 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
28070 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
28080 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
28090 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
280a0 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
280b0 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
280c0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
280d0 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
280e0 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
280f0 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
28100 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
28110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28120 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
28130 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
28140 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
28150 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
28160 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28170 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
28180 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
28190 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
281a0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
281b0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
281c0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
281d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
281e0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
281f0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
28200 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
28210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28220 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28240 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
28250 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
28260 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
28270 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20  nalHdr));.      
28280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28290 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20  Write(.         
282a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20     pPager->jfd, 
282b0 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
282c0 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72  zHeader), pPager
282d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
282e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
282f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28300 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28320 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28330 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
28340 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
28350 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
28360 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
28370 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28380 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
28390 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
283a0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
283b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
283c0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
283d0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
283e0 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  Flags| .        
283f0 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46    (pPager->syncF
28400 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
28410 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
28420 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
28430 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28450 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28460 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
28470 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28480 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
28490 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69  rnalOff;.      i
284a0 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d  f( newHdr && 0==
284b0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
284c0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
284d0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
284e0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
284f0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
28500 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
28510 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28530 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28550 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28560 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
28570 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
28580 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73  .  }..  /* Unles
28590 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
285a0 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74  n noSync mode, t
285b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
285c0 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73  was just .  ** s
285d0 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63  uccessfully sync
285e0 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
285f0 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
28600 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
28610 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65  n .  ** all page
28620 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
28630 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
28640 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
28650 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72  Cache);.  pPager
28660 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
28670 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20  _WRITER_DBMOD;. 
28680 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
28690 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
286a0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
286b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
286c0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
286d0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
286e0 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
286f0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f  f dirty pages co
28700 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68  nnected.** by th
28710 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
28720 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ointer. This fun
28730 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63  ction writes eac
28740 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  h one of the.** 
28750 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
28760 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  in the list to t
28770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28780 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  . The argument m
28790 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72  ay.** be NULL, r
287a0 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65  epresenting an e
287b0 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68  mpty list. In th
287c0 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
287d0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f  ction is.** a no
287e0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
287f0 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ager must hold a
28800 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
28810 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69  ED lock when thi
28820 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
28830 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20   called. Before 
28840 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67  writing anything
28850 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28860 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b   file, this lock
28870 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20  .** is upgraded 
28880 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
28890 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
288a0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
288b0 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ined,.** SQLITE_
288c0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
288d0 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20   and no data is 
288e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
288f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
28900 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65   .** If the page
28910 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  r is a temp-file
28920 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61   pager and the a
28930 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65  ctual file-syste
28940 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74  m file.** is not
28950 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   yet open, it is
28960 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65   created and ope
28970 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  ned before any d
28980 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ata is .** writt
28990 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  en out..**.** On
289a0 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  ce the lock has 
289b0 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e  been upgraded an
289c0 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
289d0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
289e0 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61  ,.** the pages a
289f0 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  re written out t
28a00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28a10 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65  ile in list orde
28a20 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20  r. Writing.** a 
28a30 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20  page is skipped 
28a40 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68  if it meets eith
28a50 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
28a60 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a  ing criteria:.**
28a70 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
28a80 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
28a90 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  er than Pager.db
28aa0 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  Size, or.**   * 
28ab0 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  The PGHDR_DONT_W
28ac0 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  RITE flag is set
28ad0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
28ae0 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f  .** If writing o
28af0 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73  ut a page causes
28b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28b10 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65  le to grow, Page
28b20 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20  r.dbFileSize.** 
28b30 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
28b40 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20  dingly. If page 
28b50 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74  1 is written out
28b60 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
28b70 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61   cached.** in Pa
28b80 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
28b90 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
28ba0 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c  atch the new val
28bb0 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
28bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28bd0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
28be0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
28bf0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
28c00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
28c10 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
28c20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
28c30 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
28c40 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
28c50 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
28c60 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74  cannot.** be obt
28c70 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55  ained, SQLITE_BU
28c80 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
28c90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
28ca0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
28cb0 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  st(Pager *pPager
28cc0 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  , PgHdr *pList){
28cd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28ce0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
28cf0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28d00 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
28d10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
28d20 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72   only called for
28d30 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73   rollback pagers
28d40 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44   in WRITER_DBMOD
28d50 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73   state. */.  ass
28d60 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
28d70 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
28d80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
28d90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
28da0 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61  TER_DBMOD );.  a
28db0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
28dc0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
28dd0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
28de0 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
28df0 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
28e00 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
28e10 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
28e20 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
28e30 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
28e40 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
28e50 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
28e60 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
28e70 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
28e80 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
28e90 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
28ea0 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
28eb0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
28ec0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
28ed0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28ee0 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
28ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
28f00 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
28f10 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
28f20 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
28f30 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
28f40 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
28f50 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
28f60 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
28f70 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
28f80 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
28f90 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
28fa0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
28fb0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
28fc0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
28fd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28fe0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
28ff0 64 62 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64  dbSize>pPager->d
29000 62 48 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20  bHintSize ){.   
29010 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
29020 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
29030 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
29040 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
29050 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
29060 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
29070 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
29080 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
29090 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
290a0 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
290b0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
290c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
290d0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
290e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
290f0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
29100 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
29110 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
29120 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
29130 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
29140 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
29150 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
29160 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
29170 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
29180 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
29190 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
291a0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
291b0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
291c0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
291d0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
291e0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
291f0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
29200 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
29210 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
29220 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
29230 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
29240 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
29250 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
29260 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
29270 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
29280 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
29290 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
292a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
292b0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
292c0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
292d0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
292e0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
292f0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
29300 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
29310 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
29320 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
29330 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
29340 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29360 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
29370 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
29380 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
29390 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
293a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
293b0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
293c0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
293d0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
293e0 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
293f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
29400 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
29410 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
29420 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
29430 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
29440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29450 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  EM, pData);..   
29460 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
29470 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
29480 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
29490 65 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 3e 3d 28  er->nMapValid>=(
294a0 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70  offset+pPager->p
294b0 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
294c0 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
294d0 20 2a 29 28 70 50 61 67 65 72 2d 3e 70 4d 61 70   *)(pPager->pMap
294e0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 44 61 74  ))[offset], pDat
294f0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
29500 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
29510 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
29520 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
29530 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
29540 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
29550 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ze, offset);.   
29560 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
29570 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
29580 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
29590 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
295a0 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
295b0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
295c0 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
295d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
295e0 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
295f0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
29600 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
29610 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
29620 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
29630 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
29640 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
29650 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
29660 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
29670 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
29680 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
29690 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
296a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
296b0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
296c0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
296d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
296e0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
296f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
29700 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
29710 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b  R_STAT_WRITE]++;
29720 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
29730 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
29740 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
29750 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
29760 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
29770 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
29780 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
29790 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
297a0 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b  *)pList->pData);
297b0 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
297c0 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
297d0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
297e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
297f0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
29800 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
29810 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
29820 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
29830 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
29840 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
29850 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
29860 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
29870 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
29880 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ount);.    }else
29890 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
298a0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
298b0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
298c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
298d0 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
298e0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
298f0 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
29900 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
29910 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
29920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29930 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
29940 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
29950 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
29960 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
29970 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
29980 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
29990 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
299a0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
299b0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
299c0 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
299d0 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
299e0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
299f0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
29a00 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
29a10 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
29a20 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
29a30 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
29a40 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
29a50 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
29a60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
29a70 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
29a80 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
29a90 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
29aa0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
29ab0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
29ac0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
29ad0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
29ae0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
29af0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
29b00 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
29b10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29b20 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
29b30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
29b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
29b50 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
29b60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29b70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
29b80 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
29b90 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
29ba0 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
29bb0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
29bc0 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
29bd0 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
29be0 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
29bf0 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
29c00 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
29c10 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
29c20 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
29c30 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
29c40 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
29c50 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
29c60 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
29c70 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
29c80 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
29c90 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
29ca0 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
29cb0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
29cc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
29cd0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
29ce0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
29cf0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
29d00 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
29d10 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
29d20 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
29d30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
29d40 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
29d50 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
29d60 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
29d70 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
29d80 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
29d90 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
29da0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
29db0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
29dc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
29dd0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
29de0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
29df0 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
29e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
29e10 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
29e20 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
29e30 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
29e40 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
29e50 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
29e60 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
29e70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29e80 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
29e90 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
29ea0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
29eb0 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
29ec0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
29ed0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
29ee0 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
29ef0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
29f00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29f10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
29f20 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
29f30 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
29f40 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
29f50 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
29f60 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
29f70 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
29f80 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
29f90 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
29fa0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
29fb0 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
29fc0 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
29fd0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
29fe0 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
29ff0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
2a000 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2a010 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2a020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a030 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
2a040 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
2a050 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
2a060 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
2a070 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
2a080 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
2a090 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
2a0a0 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
2a0b0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
2a0c0 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
2a0d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
2a0e0 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2a0f0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
2a100 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
2a110 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2a120 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2a130 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
2a140 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2a150 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
2a160 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
2a170 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a190 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a1a0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
2a1b0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
2a1c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a1d0 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
2a1e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2a1f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a200 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
2a210 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
2a220 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
2a230 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
2a240 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
2a250 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2a260 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2a270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a290 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2a2a0 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2a2b0 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2a2c0 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2a2d0 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2a2e0 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2a2f0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2a300 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2a310 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2a320 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2a330 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2a340 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2a350 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2a360 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2a370 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a380 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2a390 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2a3a0 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2a3b0 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2a3c0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2a3d0 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2a3e0 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2a3f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2a400 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2a410 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2a420 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2a430 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2a440 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2a450 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2a460 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2a470 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2a480 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2a490 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2a4a0 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2a4b0 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2a4c0 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2a4d0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2a4e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2a4f0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2a500 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2a510 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2a520 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2a530 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2a540 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2a550 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2a560 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2a570 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2a580 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2a590 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2a5a0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2a5b0 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2a5c0 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2a5d0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2a5e0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2a5f0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2a600 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2a610 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2a620 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2a630 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2a640 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2a650 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2a660 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2a670 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2a680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a690 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2a6a0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2a6b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2a6c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2a6d0 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2a6e0 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
2a6f0 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69  flag is set duri
2a700 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2a710 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2a720 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2a730 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2a740 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2a750 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2a760 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2a770 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2a780 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2a790 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2a7a0 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2a7b0 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2a7c0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2a7d0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2a7e0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  he doNotSpill fl
2a7f0 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ag inhibits all 
2a800 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72  cache spilling r
2a810 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2a820 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74  ther.  ** or not
2a830 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2a840 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2a850 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  t during a rollb
2a860 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ack..  **.  ** S
2a870 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
2a880 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
2a890 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
2a8a0 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
2a8b0 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
2a8c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
2a8d0 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
2a8e0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
2a8f0 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ton it .  ** is 
2a900 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2a910 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2a920 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2a930 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2a940 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==1.  ** while i
2a950 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2a960 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2a970 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2a980 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2a990 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2a9a0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2a9b0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2a9c0 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2a9d0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2a9e0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2a9f0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2aa00 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2aa10 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2aa20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2aa30 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2aa40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2aa50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
2aa60 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72  NotSpill ) retur
2aa70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
2aa80 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
2aa90 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50  SyncSpill && (pP
2aaa0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
2aab0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
2aac0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2aad0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2aae0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
2aaf0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
2ab00 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
2ab10 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2ab20 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2ab30 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2ab40 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  g. */.    if( su
2ab50 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
2ab60 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63  Pg) ){ .      rc
2ab70 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
2ab80 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20  e(pPg); .    }. 
2ab90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2aba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2abb0 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2abc0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2abd0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2abe0 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
2abf0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2ac00 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2ac10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2ac20 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2ac30 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2ac40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2ac50 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2ac60 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2ac70 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2ac80 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2ac90 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2aca0 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
2acb0 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
2acc0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2acd0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2ace0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
2acf0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
2ad00 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
2ad10 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2ad20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
2ad30 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
2ad40 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
2ad50 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2ad60 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
2ad70 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
2ad80 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
2ad90 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
2ada0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
2adb0 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
2adc0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
2add0 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
2ade0 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
2adf0 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
2ae00 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
2ae10 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2ae20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
2ae30 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
2ae40 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
2ae50 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
2ae60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2ae70 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
2ae80 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
2ae90 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
2aea0 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
2aeb0 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
2aec0 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
2aed0 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
2aee0 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
2aef0 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
2af00 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
2af10 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2af20 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
2af30 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
2af40 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
2af50 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
2af60 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
2af70 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
2af80 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
2af90 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
2afa0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
2afb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2afc0 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
2afd0 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
2afe0 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
2aff0 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
2b000 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
2b010 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
2b020 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
2b030 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
2b040 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
2b050 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
2b060 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
2b070 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
2b080 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
2b090 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
2b0a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
2b0b0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
2b0c0 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
2b0d0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
2b0e0 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
2b0f0 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
2b100 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
2b110 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
2b120 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
2b130 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
2b140 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
2b150 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
2b160 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
2b170 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2b180 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2b190 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
2b1a0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
2b1b0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2b1c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2b1d0 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
2b1e0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
2b1f0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2b200 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2b210 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b220 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2b230 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
2b240 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2b250 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
2b260 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2b270 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50  elist(pPager, pP
2b280 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
2b290 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2b2a0 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
2b2b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b2c0 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
2b2d0 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
2b2e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2b2f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2b300 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
2b310 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2b320 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
2b330 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2b340 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2b350 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ); .}.../*.** Al
2b360 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2b370 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
2b380 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
2b390 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2b3a0 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
2b3b0 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
2b3c0 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
2b3d0 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
2b3e0 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
2b3f0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
2b400 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
2b410 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
2b420 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
2b430 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2b440 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
2b450 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
2b460 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
2b470 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
2b480 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
2b490 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
2b4a0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
2b4b0 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
2b4c0 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
2b4d0 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
2b4e0 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
2b4f0 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
2b500 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
2b510 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
2b520 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
2b530 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
2b540 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
2b550 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
2b560 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2b570 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
2b580 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2b590 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
2b5a0 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
2b5b0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
2b5c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2b5d0 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
2b5e0 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
2b5f0 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
2b600 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
2b610 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
2b620 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
2b630 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
2b640 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
2b650 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
2b660 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
2b670 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
2b680 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
2b690 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
2b6a0 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
2b6b0 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
2b6c0 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
2b6d0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
2b6e0 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a  * of the PAGER_*
2b6f0 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
2b700 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
2b710 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
2b720 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
2b730 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2b740 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
2b750 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
2b760 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
2b770 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
2b780 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
2b790 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
2b7a0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2b7b0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2b7c0 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
2b7d0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
2b7e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2b7f0 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
2b800 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
2b810 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
2b820 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
2b830 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
2b840 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
2b850 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
2b860 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
2b870 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2b880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b890 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
2b8a0 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
2b8b0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
2b8c0 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
2b8d0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
2b8e0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
2b8f0 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
2b900 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
2b910 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2b920 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
2b930 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
2b940 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
2b950 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
2b960 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
2b970 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
2b980 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2b990 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2b9a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2b9b0 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
2b9c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b9d0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2b9e0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
2b9f0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2ba00 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
2ba10 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2ba20 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
2ba30 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2ba40 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
2ba50 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
2ba60 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
2ba70 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
2ba80 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
2ba90 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
2baa0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
2bab0 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2bac0 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
2bad0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
2bae0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
2baf0 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
2bb00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2bb10 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
2bb20 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
2bb30 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
2bb40 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
2bb50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2bb60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2bb70 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
2bb80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2bb90 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
2bba0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
2bbb0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
2bbc0 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
2bbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2bbe0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2bbf0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
2bc00 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
2bc10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2bc20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2bc30 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
2bc40 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
2bc50 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
2bc60 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2bc70 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
2bc80 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
2bc90 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
2bca0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
2bcb0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
2bcc0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
2bcd0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2bce0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2bcf0 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
2bd00 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
2bd10 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
2bd20 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
2bd30 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
2bd40 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
2bd50 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  l */.  int pcach
2bd60 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
2bd70 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
2bd80 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2bd90 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
2bda0 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61  he */.  u32 szPa
2bdb0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2bdc0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bdd0 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
2bde0 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f  age size */.  co
2bdf0 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d  nst char *zUri =
2be00 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72   0;    /* URI ar
2be10 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  gs to copy */.  
2be20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20  int nUri = 0;   
2be30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2be40 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55  er of bytes of U
2be50 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69  RI args at *zUri
2be60 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
2be70 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
2be80 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
2be90 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2bea0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
2beb0 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
2bec0 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
2bed0 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
2bee0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
2bef0 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
2bf00 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
2bf10 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
2bf20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
2bf30 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
2bf40 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
2bf50 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
2bf60 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
2bf70 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
2bf80 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
2bf90 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
2bfa0 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
2bfb0 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
2bfc0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
2bfd0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
2bfe0 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
2bff0 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
2c000 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2c010 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
2c020 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
2c030 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
2c040 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
2c050 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
2c060 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
2c070 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
2c080 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2c090 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2c0a0 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
2c0b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
2c0c0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2c0d0 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
2c0e0 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
2c0f0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2c100 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2c110 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2c120 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2c130 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2c140 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2c150 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2c160 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2c170 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2c180 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2c190 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
2c1a0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2c1b0 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68  ] ){.      zPath
2c1c0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2c1d0 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e  StrDup(0, zFilen
2c1e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2c1f0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20  zPathname==0  ) 
2c200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2c210 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74 68  MEM;.      nPath
2c220 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2c230 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2c240 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  );.      zFilena
2c250 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
2c260 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
2c270 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
2c280 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2c290 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
2c2a0 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
2c2b0 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
2c2c0 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
2c2d0 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
2c2e0 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
2c2f0 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
2c300 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
2c310 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
2c320 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
2c330 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2c340 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2c350 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
2c360 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74  har *z;.    nPat
2c370 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
2c380 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
2c390 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2c3a0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
2c3b0 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  , nPathname*2);.
2c3c0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2c3d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2c3e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2c3f0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  M;.    }.    zPa
2c400 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2c410 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2c420 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2c430 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2c440 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2c450 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2c460 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2c470 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2c480 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2c490 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2c4a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c4b0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2c4c0 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2c4d0 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2c4e0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2c4f0 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2c500 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2c510 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c520 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2c530 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c540 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2c550 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a   nUri = (int)(&z
2c560 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20  [1] - zUri);.   
2c570 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30   assert( nUri>=0
2c580 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
2c590 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
2c5a0 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
2c5b0 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
2c5c0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2c5d0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
2c5e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
2c5f0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2c600 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2c610 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
2c620 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
2c630 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
2c640 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
2c650 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
2c660 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
2c670 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
2c680 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
2c690 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
2c6a0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
2c6b0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2c6c0 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
2c6d0 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
2c6e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
2c6f0 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
2c700 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2c710 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2c720 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2c730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2c750 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2c760 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2c770 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2c780 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2c790 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2c7a0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2c7b0 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2c7c0 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2c7d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c7e0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2c7f0 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2c800 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2c810 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2c820 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2c830 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2c840 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2c850 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2c870 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2c880 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2c890 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2c8b0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c8c0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2c8d0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2c8e0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2c8f0 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2c900 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2c910 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2c920 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2c930 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2c940 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2c950 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2c960 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2c970 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2c980 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2c990 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2c9a0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2c9b0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2c9c0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2c9d0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2c9e0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2c9f0 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2ca00 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2ca10 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2ca20 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2ca30 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2ca40 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2ca50 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2ca60 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2ca70 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2ca80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2ca90 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2caa0 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2cab0 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2cac0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2cad0 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2cae0 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2caf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cb00 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2cb10 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2cb20 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20  name + 1 + nUri 
2cb30 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69  +         /* zFi
2cb40 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2cb50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20  athname + 8 + 2 
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb70 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2cb80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cb90 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2cba0 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20  ame + 4 + 2     
2cbb0 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
2cbc0 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
2cbd0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2cbe0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
2cbf0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
2cc00 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
2cc10 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
2cc20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2cc30 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2cc40 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
2cc50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2cc60 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2cc70 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2cc80 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2cc90 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2cca0 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2ccb0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2ccc0 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2ccd0 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2cce0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2ccf0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2cd00 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2cd10 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2cd20 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2cd30 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2cd40 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2cd50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2cd60 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2cd70 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2cd80 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2cd90 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2cda0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2cdb0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2cdc0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2cdd0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2cde0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2cdf0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2ce00 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2ce10 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2ce20 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2ce30 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2ce40 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2ce50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2ce60 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2ce70 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2ce80 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2ce90 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2cea0 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2ceb0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2cec0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2ced0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2cee0 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2cef0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2cf00 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2cf10 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2cf20 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2cf30 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2cf40 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2cf50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2cf60 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2cf70 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2cf80 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2cf90 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2cfa0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2cfb0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2cfc0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2cfd0 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2cfe0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2cff0 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2d000 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2d010 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2d020 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2d030 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2d040 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d050 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2d060 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2d070 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2d080 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2d090 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2d0a0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d0b0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2d0c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2d0d0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2d0e0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2d0f0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2d100 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2d110 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2d120 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2d130 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2d140 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2d150 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2d160 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2d170 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d190 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2d1a0 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2d1b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d1c0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2d1d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d1e0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2d1f0 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2d200 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2d210 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  b );.    readOnl
2d220 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2d230 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2d240 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2d250 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2d260 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2d270 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2d280 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2d290 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2d2a0 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2d2b0 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2d2c0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2d2d0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2d2e0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d2f0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2d300 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2d310 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2d320 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2d330 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2d340 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2d350 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2d360 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2d370 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2d380 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2d390 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2d3a0 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2d3b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d3c0 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
2d3d0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74  nly ){.      set
2d3e0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2d3f0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
2d400 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2d410 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2d420 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d430 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2d440 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
2d450 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2d460 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
2d470 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2d480 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2d490 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
2d4b0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2d4c0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d4d0 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2d4e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d4f0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
2d500 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u32)pPager->sect
2d510 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
2d520 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
2d530 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2d540 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2d550 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
2d560 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
2d570 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2d580 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
2d590 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  ;.        int ii
2d5a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d5b0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2d5c0 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2d5d0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
2d5e0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2d5f0 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
2d600 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
2d610 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
2d620 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2d630 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
2d640 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2d650 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2d660 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2d670 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2d680 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2){.          if
2d690 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
2d6a0 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
2d6b0 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
2d6c0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2d6d0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
2d6e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d6f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
2d700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2d710 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2d720 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2d730 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2d740 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2d750 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2d760 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2d770 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2d780 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2d790 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2d7a0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2d7b0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2d7c0 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2d7d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2d7e0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2d7f0 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2d800 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2d810 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2d820 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2d830 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2d840 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2d850 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2d860 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2d870 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2d880 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2d890 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2d8a0 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
2d8b0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2d8c0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2d8d0 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
2d8e0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2d8f0 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
2d900 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
2d910 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2d920 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
2d930 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2d940 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
2d950 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
2d960 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
2d970 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
2d980 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
2d990 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
2d9a0 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
2d9b0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
2d9c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d9d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2d9e0 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
2d9f0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2da00 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
2da10 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
2da20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
2da30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2da40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2da50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2da60 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2da70 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
2da80 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
2da90 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
2daa0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
2dab0 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
2dac0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
2dad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dae0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2daf0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
2db00 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2db10 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2db20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2db30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
2db40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2db50 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
2db60 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
2db70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
2db80 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
2db90 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
2dba0 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
2dbb0 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
2dbc0 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
2dbd0 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
2dbf0 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
2dc00 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
2dc10 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
2dc20 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
2dc30 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
2dc40 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
2dc50 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
2dc60 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2dc70 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
2dc80 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
2dc90 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
2dca0 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
2dcb0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
2dcc0 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
2dcd0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2dce0 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
2dcf0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2dd00 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
2dd10 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
2dd20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2dd30 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
2dd40 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2dd50 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
2dd60 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2dd70 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
2dd80 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
2dd90 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
2dda0 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
2ddb0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2ddc0 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
2ddd0 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
2dde0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d  pPager->state ==
2ddf0 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47   (tempFile ? PAG
2de00 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50  ER_EXCLUSIVE : P
2de10 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a  AGER_UNLOCK) );.
2de20 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
2de30 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
2de40 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
2de50 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
2de60 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
2de70 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2de80 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2de90 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
2dea0 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
2deb0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2dec0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2ded0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2dee0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2def0 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
2df00 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2df10 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
2df20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2df30 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
2df40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2df50 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
2df60 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
2df70 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
2df80 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
2df90 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e  assert( useJourn
2dfa0 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  al || pPager->te
2dfb0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67  mpFile );.  pPag
2dfc0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
2dfd0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2dfe0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
2dff0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
2e000 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
2e010 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2e020 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2e030 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2e040 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e050 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2e060 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e070 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2e080 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2e090 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2e0a0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2e0b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2e0c0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2e0d0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2e0e0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2e0f0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2e100 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2e110 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2e120 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2e130 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2e140 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2e150 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2e160 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2e170 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e180 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2e190 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e1a0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2e1b0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2e1c0 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2e1d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2e1e0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2e1f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2e200 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2e210 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2e220 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2e230 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2e240 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2e250 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2e260 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2e270 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2e280 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2e290 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2e2a0 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2e2b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2e2c0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2e2d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2e2e0 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2e2f0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2e300 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2e310 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2e320 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2e330 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2e340 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2e350 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2e360 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2e370 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2e380 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  )); */..  *ppPag
2e390 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2e3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e3b0 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .}..../*.** This
2e3c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2e3d0 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2e3e0 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2e3f0 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2e400 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2e410 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2e420 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2e430 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2e440 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2e450 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2e460 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2e470 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2e480 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2e490 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2e4a0 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2e4b0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2e4c0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2e4d0 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2e4e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2e4f0 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2e500 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2e510 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2e520 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2e530 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2e540 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2e550 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2e560 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2e570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2e580 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2e590 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2e5a0 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2e5b0 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2e5c0 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2e5d0 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2e5e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2e5f0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2e600 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2e610 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2e620 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2e630 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2e640 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2e650 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2e660 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2e670 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2e680 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2e690 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2e6a0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2e6b0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2e6c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e6d0 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2e6e0 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2e6f0 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2e700 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2e710 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2e720 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2e730 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2e740 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2e750 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2e760 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2e770 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2e780 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2e790 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2e7a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2e7b0 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2e7c0 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2e7d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2e7e0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2e7f0 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2e800 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2e810 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2e820 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2e830 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2e840 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2e850 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2e860 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e870 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2e880 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2e890 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2e8a0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2e8b0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2e8c0 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2e8d0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2e8e0 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2e8f0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2e900 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2e910 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2e920 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2e930 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2e940 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2e950 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2e960 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2e970 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2e980 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2e990 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2e9a0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2e9b0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2e9c0 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2e9d0 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2e9e0 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2e9f0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2ea00 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2ea10 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2ea20 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2ea30 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2ea40 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2ea50 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2ea60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ea70 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2ea80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2ea90 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2eaa0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2eab0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2eac0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2ead0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2eae0 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2eaf0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2eb00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2eb10 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2eb20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2eb30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2eb40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2eb50 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2eb60 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2eb70 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2eb80 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2eb90 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2eba0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2ebb0 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2ebc0 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2ebd0 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2ebe0 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2ebf0 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2ec00 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2ec10 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2ec20 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2ec30 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2ec40 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2ec50 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2ec60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ec70 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2ec80 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2ec90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2eca0 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2ecb0 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2ecc0 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
2ecd0 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
2ece0 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
2ecf0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2ed00 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
2ed10 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
2ed20 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2ed30 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
2ed40 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
2ed50 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2ed60 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
2ed70 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
2ed80 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2ed90 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
2eda0 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
2edb0 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
2edc0 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
2edd0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2ede0 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
2edf0 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
2ee00 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
2ee10 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
2ee20 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
2ee30 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
2ee40 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
2ee50 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
2ee60 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
2ee70 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
2ee80 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
2ee90 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
2eea0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
2eeb0 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
2eec0 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
2eed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
2eee0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2eef0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
2ef00 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
2ef10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ef20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
2ef30 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ef50 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2ef60 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2ef70 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68   */..      /* Ch
2ef80 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20  eck the size of 
2ef90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2efa0 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74  e. If it consist
2efb0 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20  s of 0 pages,.  
2efc0 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65      ** then dele
2efd0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
2efe0 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61  ile. See the hea
2eff0 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  der comment abov
2f000 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  e for .      ** 
2f010 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65  the reasoning he
2f020 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  re.  Delete the 
2f030 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
2f040 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20   file under.    
2f050 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20    ** a RESERVED 
2f060 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61  lock to avoid ra
2f070 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e  ce conditions an
2f080 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61  d to avoid viola
2f090 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48  ting.      ** [H
2f0a0 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f  33020]..      */
2f0b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2f0c0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2f0d0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2f0e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f0f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
2f100 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
2f110 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f120 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2f130 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
2f140 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70  f( pagerLockDb(p
2f150 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
2f160 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
2f170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f180 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
2f190 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2f1a0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
2f1b0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2f1c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2f1d0 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b  de ) pagerUnlock
2f1e0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2f1f0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
2f200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2f210 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
2f220 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2f230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f240 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
2f250 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2f260 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2f270 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72  tion has a reser
2f280 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ved.          **
2f290 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2f2a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2f2b0 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b   file. Now check
2f2c0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20   that there is. 
2f2d0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c           ** at l
2f2e0 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72  east one non-zer
2f2f0 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  o bytes at the s
2f300 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2f310 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
2f320 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
2f330 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73  is, then we cons
2f340 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61  ider this journa
2f350 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20  l to be hot. If 
2f360 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  not, .          
2f370 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e  ** it can be ign
2f380 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ored..          
2f390 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2f3a0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2f3b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
2f3c0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2f3d0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
2f3e0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
2f3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f400 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2f410 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2f420 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2f430 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
2f440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f450 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f470 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
2f480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2f490 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
2f4a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
2f4b0 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
2f4c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2f4d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f4e0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
2f4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f500 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2f520 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f530 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2f540 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2f550 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2f560 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2f570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f580 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
2f590 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
2f5a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2f5b0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
2f5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f5d0 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
2f5e0 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
2f5f0 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
2f600 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
2f610 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
2f620 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
2f630 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
2f640 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
2f650 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
2f660 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
2f670 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
2f680 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
2f690 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
2f6a0 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
2f6b0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
2f6c0 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
2f6d0 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
2f6e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
2f6f0 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
2f700 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
2f710 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
2f720 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
2f730 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
2f740 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
2f750 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
2f760 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
2f770 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
2f780 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
2f790 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
2f7a0 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
2f7b0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
2f7c0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
2f7d0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
2f7e0 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
2f7f0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
2f800 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2f810 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
2f820 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
2f830 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f840 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
2f850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f860 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2f870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2f880 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f890 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
2f8a0 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
2f8b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2f8c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
2f8d0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
2f8e0 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
2f8f0 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
2f900 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
2f910 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
2f920 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
2f930 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
2f940 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
2f950 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
2f960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f970 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2f980 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
2f990 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
2f9a0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
2f9b0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
2f9c0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
2f9d0 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
2f9e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
2f9f0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
2fa00 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
2fa10 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
2fa20 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
2fa30 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
2fa40 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
2fa50 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
2fa60 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
2fa70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
2fa80 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
2fa90 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
2faa0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
2fab0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
2fac0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
2fad0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
2fae0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
2faf0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
2fb00 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
2fb10 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
2fb20 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
2fb30 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
2fb40 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
2fb50 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
2fb60 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
2fb70 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
2fb80 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
2fb90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fba0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
2fbb0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
2fbc0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
2fbd0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
2fbe0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
2fbf0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
2fc00 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
2fc10 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
2fc20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
2fc30 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
2fc40 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
2fc50 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
2fc60 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
2fc70 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
2fc80 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
2fc90 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
2fca0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2fcb0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
2fcc0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
2fcd0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2fce0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
2fcf0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
2fd00 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
2fd10 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2fd20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2fd30 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2fd40 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2fd50 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2fd60 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
2fd70 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
2fd80 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
2fd90 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2fda0 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
2fdb0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
2fdc0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
2fdd0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2fde0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
2fdf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
2fe00 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
2fe10 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2fe20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe40 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2fe50 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2fe60 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2fe70 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
2fe80 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
2fe90 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
2fea0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
2feb0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
2fec0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
2fed0 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
2fee0 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
2fef0 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
2ff00 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
2ff10 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
2ff20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
2ff30 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
2ff40 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
2ff50 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
2ff60 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2ff70 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
2ff80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
2ff90 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
2ffa0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
2ffb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2ffc0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2ffd0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2ffe0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
2fff0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
30000 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
30010 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
30020 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
30030 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
30040 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
30050 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
30060 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30070 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
30080 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
30090 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
300a0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
300b0 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
300c0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
300d0 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72  !MEMDB );..    r
300e0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
300f0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
30100 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
30110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30120 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
30130 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
30140 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
30150 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
30160 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
30170 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30180 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30190 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
301a0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
301b0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
301c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
301d0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
301e0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
301f0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
30200 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
30210 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
30220 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
30230 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
30240 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
30250 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
30260 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
30270 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30280 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30290 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
302a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
302b0 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
302c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
302d0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
302e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
302f0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
30300 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
30310 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30320 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
30330 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
30340 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30350 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
30360 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
30370 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
30380 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
30390 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
303a0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
303b0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
303c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
303d0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
303e0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
303f0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
30400 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
30410 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
30420 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
30430 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
30440 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
30450 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
30460 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
30470 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
30480 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
30490 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
304a0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
304b0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
304c0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
304d0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
304e0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
304f0 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
30500 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
30510 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
30520 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
30530 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
30540 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
30550 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
30560 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
30570 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
30580 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
30590 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
305a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
305b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
305c0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
305d0 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
305e0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
305f0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
30600 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
30610 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
30620 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
30630 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
30640 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
30650 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
30660 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
30670 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
30680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
306a0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
306b0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
306c0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
306d0 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
306e0 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
306f0 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
30700 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
30710 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
30720 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
30730 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
30740 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
30750 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
30760 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
30770 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
30780 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
30790 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
307a0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
307b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
307c0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
307d0 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
307e0 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
307f0 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
30800 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
30810 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
30820 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
30830 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
30840 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
30850 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
30860 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
30870 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
30880 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
30890 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
308a0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
308b0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
308c0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
308d0 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
308e0 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
308f0 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
30900 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
30910 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
30920 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
30930 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
30940 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
30950 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
30960 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
30970 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
30980 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
30990 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
309a0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
309b0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
309c0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
309d0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
309e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
309f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30a00 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
30a10 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
30a20 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
30a30 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
30a40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30a50 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
30a60 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
30a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
30a80 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
30a90 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
30aa0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
30ab0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
30ac0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
30ad0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30ae0 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
30af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
30b00 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
30b10 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
30b20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
30b30 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
30b40 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
30b50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30b60 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
30b70 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
30b80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
30b90 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
30ba0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
30bb0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
30bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
30bd0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
30be0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
30bf0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
30c00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30c10 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
30c20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
30c30 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
30c40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30c50 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
30c60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30c70 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
30c80 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
30c90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30ca0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
30cb0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
30cc0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
30cd0 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
30ce0 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
30cf0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
30d00 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
30d10 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
30d20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
30d30 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
30d40 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
30d50 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
30d60 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
30d70 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
30d80 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
30d90 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
30da0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
30db0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
30dc0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
30dd0 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
30de0 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
30df0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
30e00 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
30e10 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
30e20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
30e30 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
30e40 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
30e50 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
30e60 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
30e70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
30e80 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
30e90 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
30ea0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
30eb0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
30ec0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
30ed0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
30ee0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
30ef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30f00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
30f10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
30f20 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
30f30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
30f40 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
30f50 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
30f60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
30f70 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
30f80 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
30f90 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
30fa0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
30fb0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
30fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
30fe0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
30ff0 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
31000 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
31010 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
31020 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
31030 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
31040 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
31050 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
31060 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
31070 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
31080 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
31090 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
310a0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
310b0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
310c0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
310d0 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
310e0 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
310f0 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
31100 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
31110 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
31120 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
31130 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
31140 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
31150 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
31160 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
31170 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
31180 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31190 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
311a0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
311b0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
311c0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
311d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
311e0 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
311f0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
31200 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
31210 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
31220 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
31230 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
31240 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
31250 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
31260 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
31270 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
31280 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
31290 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
312a0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
312b0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
312c0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
312d0 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
312e0 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
312f0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
31300 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
31310 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
31320 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
31330 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
31340 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
31350 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
31360 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
31370 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
31380 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
31390 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
313a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
313b0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
313c0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
313d0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
313e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
313f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31400 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
31410 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31420 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
31430 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
31440 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
31450 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31460 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
31470 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
31480 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
31490 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
314a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28  r->tempFile && (
314b0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
314c0 3e 70 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c  >pBackup .     |
314d0 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
314e0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
314f0 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20  >pPCache)>0 .   
31500 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 4d 61    || pPager->pMa
31510 70 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20  p.    )){.      
31520 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
31530 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
31540 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
31550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
31560 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
31570 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
31580 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
31590 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
315a0 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  s.      ** read 
315b0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
315c0 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
315d0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
315e0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  base.      ** ha
315f0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
31600 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
31610 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
31620 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a  lush the.      *
31630 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  * cache..      *
31640 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
31650 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
31660 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
31670 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
31680 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
31690 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
316a0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
316b0 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
316c0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
316d0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
316e0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
316f0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
31700 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
31710 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
31720 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
31730 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
31740 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
31750 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
31760 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
31770 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
31780 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
31790 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
317a0 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
317b0 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
317c0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
317d0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
317e0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
317f0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
31800 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
31810 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
31820 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
31830 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  */.      Pgno nP
31840 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  age = 0;.      c
31850 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
31860 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
31870 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20  FileVers)];..   
31880 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
31890 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
318a0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
318b0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c  ( rc ) goto fail
318c0 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  ed;..      if( n
318d0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Page>0 ){.      
318e0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
318f0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
31900 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
31910 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
31920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31930 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
31940 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
31950 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
31960 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
31970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31980 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
31990 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
319a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
319b0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
319c0 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
319d0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
319e0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
319f0 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
31a00 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
31a10 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
31a20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
31a30 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
31a40 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
31a50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
31a60 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74  /* Unmap the dat
31a70 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69  abase file. It i
31a80 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
31a90 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73  external process
31aa0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  es.        ** ma
31ab0 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64  y have truncated
31ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31ad0 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65  le and then exte
31ae0 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20  nded it back.   
31af0 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f       ** to its o
31b00 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69  riginal size whi
31b10 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
31b20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20  was not holding 
31b30 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  a lock..        
31b40 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
31b50 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20  there may exist 
31b60 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70  a Pager.pMap map
31b70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72  ping that appear
31b80 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  s.        ** to 
31b90 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  be the right siz
31ba0 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74  e but is not act
31bb0 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f  ually valid. Avo
31bc0 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  id this.        
31bd0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62  ** possibility b
31be0 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20  y unmapping the 
31bf0 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  db here. */.    
31c00 20 20 20 20 70 61 67 65 72 55 6e 6d 61 70 28 70      pagerUnmap(p
31c10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  Pager);.      }e
31c20 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
31c30 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
31c40 70 61 67 65 72 52 65 6d 61 70 28 70 50 61 67 65  pagerRemap(pPage
31c50 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  r, nPage);.     
31c60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
31c70 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
31c80 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
31c90 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
31ca0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
31cb0 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
31cc0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
31cd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
31ce0 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
31cf0 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
31d00 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
31d10 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
31d20 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
31d30 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
31d40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31d50 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
31d60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
31d70 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
31d80 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
31d90 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
31da0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31db0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
31dc0 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
31dd0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
31de0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
31df0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
31e00 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49  OPEN && rc==SQLI
31e10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
31e20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
31e30 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
31e40 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
31e50 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
31e60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31e70 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
31e80 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
31e90 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
31ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31eb0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
31ec0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73  R_OPEN );.  }els
31ed0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
31ee0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
31ef0 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ADER;.  }.  retu
31f00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
31f10 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
31f20 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
31f30 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
31f40 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
31f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
31f60 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
31f70 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
31f80 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
31f90 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
31fa0 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
31fb0 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
31fc0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
31fd0 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
31fe0 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
31ff0 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
32000 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
32010 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
32020 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
32030 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
32040 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
32050 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32060 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63    if( (sqlite3Pc
32070 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
32080 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
32090 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  ) && pPager->nMm
320a0 61 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  apOut==0 ){.    
320b0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
320c0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
320d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
320e0 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
320f0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
32100 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
32110 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
32120 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
32130 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
32140 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
32150 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
32160 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
32170 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
32180 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
32190 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
321a0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
321b0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
321c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
321d0 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
321e0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
321f0 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
32200 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
32210 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
32220 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
32230 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
32240 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32250 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
32260 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
32270 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
32280 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
32290 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
322a0 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
322b0 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
322c0 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
322d0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
322e0 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
322f0 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
32300 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
32310 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
32320 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
32330 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
32340 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
32350 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
32360 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
32370 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
32380 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
32390 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
323a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
323b0 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
323c0 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
323d0 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
323e0 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
323f0 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
32400 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32410 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
32420 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
32430 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
32440 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
32450 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
32460 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
32470 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
32480 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
32490 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
324a0 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
324b0 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
324c0 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
324d0 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
324e0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
324f0 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
32500 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
32510 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
32520 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
32530 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
32540 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
32550 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
32560 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
32570 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
32580 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
32590 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74  s in two seperat
325a0 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  e scenarios:.**.
325b0 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
325c0 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
325d0 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
325e0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
325f0 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
32600 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
32610 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
32620 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
32630 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
32640 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
32650 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66  he cache to be f
32660 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
32670 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
32680 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
32690 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
326a0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
326b0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
326c0 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
326d0 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
326e0 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65  d of.** being re
326f0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
32700 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
32710 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
32720 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
32730 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
32740 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
32750 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
32760 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
32770 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
32780 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
32790 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
327a0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
327b0 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
327c0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
327d0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
327e0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
327f0 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
32800 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
32810 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
32820 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
32830 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
32840 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
32850 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
32860 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
32870 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
32880 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
32890 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
328a0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
328b0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
328c0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
328d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
328e0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
328f0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
32900 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
32910 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
32920 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
32930 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
32940 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
32950 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
32960 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
32970 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
32980 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
32990 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
329a0 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
329b0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
329c0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
329d0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
329e0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
329f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
32a00 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
32a10 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
32a20 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
32a30 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
32a40 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
32a50 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
32a60 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
32a70 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
32a80 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
32a90 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
32aa0 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
32ab0 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
32ac0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
32ad0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
32ae0 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
32af0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
32b00 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
32b10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
32b20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
32b30 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
32b40 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
32b50 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
32b60 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
32b70 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
32b80 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
32b90 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
32ba0 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
32bb0 41 47 45 52 5f 41 43 51 55 49 52 45 5f 58 58 58  AGER_ACQUIRE_XXX
32bc0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69   flags */.){.  i
32bd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32be0 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  K;.  PgHdr *pPg 
32bf0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  = 0;.  const int
32c00 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c   noContent = (fl
32c10 61 67 73 20 26 20 50 41 47 45 52 5f 41 43 51 55  ags & PAGER_ACQU
32c20 49 52 45 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a  IRE_NOCONTENT);.
32c30 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65  .  /* It is acce
32c40 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20  ptable to use a 
32c50 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29  read-only (mmap)
32c60 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61   page for any pa
32c70 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70  ge except.  ** p
32c80 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69  age 1 if there i
32c90 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
32ca0 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74  action open or t
32cb0 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f  he ACQUIRE_READO
32cc0 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61  NLY.  ** flag wa
32cd0 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
32ce0 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73  he caller. And s
32cf0 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62  o long as the db
32d00 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20   is not a .  ** 
32d10 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
32d20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
32d30 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74    */.  const int
32d40 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 0a 20 20 20   bMmapOk = (.   
32d50 20 20 20 28 70 67 6e 6f 21 3d 31 20 26 26 20 70     (pgno!=1 && p
32d60 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 26  Pager->pWal==0 &
32d70 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
32d80 69 6c 65 20 26 26 20 21 4d 45 4d 44 42 29 0a 20  ile && !MEMDB). 
32d90 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
32da0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
32db0 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50  ER || (flags & P
32dc0 41 47 45 52 5f 41 43 51 55 49 52 45 5f 52 45 41  AGER_ACQUIRE_REA
32dd0 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20 20  DONLY)).  );..  
32de0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32df0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
32e00 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
32e10 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
32e20 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
32e30 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
32e40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32e50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
32e60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
32e70 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
32e80 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
32e90 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
32ea0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
32eb0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
32ec0 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
32ed0 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
32ee0 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
32ef0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
32f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32f10 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
32f20 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
32f30 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
32f40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
32f50 61 67 65 72 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b  ager->pMap==0 ){
32f60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
32f70 67 65 72 4d 61 70 28 70 50 61 67 65 72 29 3b 0a  gerMap(pPager);.
32f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32f90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32fa0 26 26 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 3e  && pPager->nMap>
32fb0 3d 28 28 69 36 34 29 70 67 6e 6f 20 2a 20 70 50  =((i64)pgno * pP
32fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
32fd0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
32fe0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
32ff0 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20  GER_READER ){.  
33000 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
33010 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
33020 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33030 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
33040 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33050 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
33060 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
33070 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
33080 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e  Page(pPager, pgn
33090 6f 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  o, &pPg);.      
330a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
330b0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pPg ){.         
330c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
330d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
330e0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
330f0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  g;.          ret
33100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
33110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33120 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
33130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33140 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
33150 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
33160 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
33170 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
33180 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
33190 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
331a0 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
331b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
331c0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
331d0 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
331e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
331f0 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
33200 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
33210 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
33220 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
33230 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
33240 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
33250 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
33260 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
33270 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
33280 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
33290 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
332a0 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
332b0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
332c0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
332d0 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
332e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
332f0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
33300 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
33310 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
33320 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
33330 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21  ge)->pPager && !
33340 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
33350 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
33360 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
33370 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
33380 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
33390 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
333a0 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
333b0 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
333c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
333d0 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
333e0 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
333f0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
33400 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67  ger) );.    pPag
33410 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
33420 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20  STAT_HIT]++;.   
33430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33440 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
33450 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
33460 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
33470 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
33480 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
33490 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
334a0 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20  ialized.  */..  
334b0 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b    pPg = *ppPage;
334c0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
334d0 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
334e0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
334f0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
33500 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
33510 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
33520 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
33530 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
33540 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
33550 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
33560 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
33570 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
33580 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
33590 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
335a0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
335b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
335c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
335d0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
335e0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
335f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d    }..    if( MEM
33600 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  DB || pPager->db
33610 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43  Size<pgno || noC
33620 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65  ontent || !isOpe
33630 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
33640 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
33650 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
33660 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
33670 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
33680 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
33690 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
336a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
336b0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
336c0 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
336d0 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
336e0 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
336f0 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
33700 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
33710 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
33720 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
33730 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
33740 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
33750 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
33760 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
33770 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
33780 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
33790 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
337a0 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
337b0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
337c0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
337d0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
337e0 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
337f0 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
33800 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
33810 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
33820 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
33830 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
33840 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
33850 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
33860 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
33870 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
33880 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
33890 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
338a0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
338b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
338c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
338d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
338e0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
338f0 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
33900 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
33910 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
33920 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
33930 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
33940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
33950 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
33960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
33970 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
33980 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
33990 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f  eSize);.      IO
339a0 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
339b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
339c0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
339d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
339e0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
339f0 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ger );.      pPa
33a00 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
33a10 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20  _STAT_MISS]++;. 
33a20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
33a30 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
33a40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33a50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
33a60 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33a70 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
33a80 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
33a90 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
33aa0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
33ab0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
33ac0 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
33ad0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
33ae0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
33af0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
33b00 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
33b10 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
33b20 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
33b30 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
33b40 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
33b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
33b60 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
33b70 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
33b80 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
33b90 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
33ba0 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
33bb0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
33bc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
33bd0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
33be0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33bf0 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
33c00 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
33c10 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
33c20 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
33c30 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
33c40 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
33c50 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
33c60 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
33c70 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
33c80 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
33c90 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
33ca0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
33cb0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
33cc0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
33cd0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
33ce0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
33cf0 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
33d00 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
33d10 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
33d20 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
33d30 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33d40 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
33d50 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
33d60 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
33d70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
33d80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
33d90 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
33da0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
33db0 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  ache!=0 );.  ass
33dc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33dd0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
33de0 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
33df0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
33e00 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   );.  sqlite3Pca
33e10 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
33e20 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
33e30 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75  0, &pPg);.  retu
33e40 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
33e50 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
33e60 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
33e70 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
33e80 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
33e90 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
33ea0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
33eb0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
33ec0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
33ed0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
33ee0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
33ef0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
33f00 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
33f10 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
33f20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
33f30 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
33f40 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
33f50 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
33f60 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
33f70 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
33f80 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
33f90 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 69 66 28  >pPager;.    if(
33fa0 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47   pPg->flags & PG
33fb0 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20  HDR_MMAP ){.    
33fc0 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
33fd0 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  pPage(pPg);.    
33fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
33ff0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
34000 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
34010 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
34020 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
34030 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
34040 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
34050 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
34060 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
34070 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
34080 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
34090 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
340a0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
340b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
340c0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
340d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
340e0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
340f0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
34100 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
34110 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
34120 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
34130 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
34140 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
34150 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
34160 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
34170 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
34180 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
34190 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
341a0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
341b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
341c0 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
341d0 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
341e0 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
341f0 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
34200 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
34210 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
34220 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
34230 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
34240 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
34250 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
34260 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
34270 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
34280 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
34290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
342a0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
342b0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
342c0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
342d0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
342e0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
342f0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
34300 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
34310 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
34320 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
34330 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
34340 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
34350 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
34360 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
34370 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
34380 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
34390 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
343a0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
343b0 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
343c0 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
343d0 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
343e0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
343f0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
34400 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
34410 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
34420 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
34430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
34440 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
34450 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
34460 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
34470 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
34480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34490 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
344a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
344b0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
344c0 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
344d0 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
344e0 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
344f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34500 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
34510 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
34520 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
34530 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
34540 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
34550 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
34560 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
34570 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
34580 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
34590 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
345a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
345b0 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
345c0 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
345d0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
345e0 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
345f0 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
34600 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
34610 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
34620 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
34630 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
34640 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
34650 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
34660 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
34670 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
34680 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
34690 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
346a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
346b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
346c0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
346d0 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
346e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
346f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
34700 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
34710 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
34720 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
34730 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
34740 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
34750 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
34760 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
34770 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
34780 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
34790 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
347a0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
347b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
347c0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
347d0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
347e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
347f0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
34800 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
34810 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
34820 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
34830 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
34840 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
34850 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
34860 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
34870 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
34880 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
34890 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
348a0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
348b0 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
348c0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
348d0 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
348e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
348f0 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
34900 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  );.  #ifdef SQLI
34910 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
34920 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 72  _WRITE.        r
34930 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
34940 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
34950 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
34960 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
34970 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
34980 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
34990 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 29  Pager).        )
349a0 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20  ;.  #else.      
349b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
349c0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
349d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
349e0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
349f0 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
34a00 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
34a10 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
34a20 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
34a30 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
34a40 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
34a50 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
34a60 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
34a70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34a80 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
34a90 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
34aa0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
34ab0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34ad0 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
34ae0 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
34af0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
34b00 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
34b10 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
34b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
34b30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
34b40 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
34b50 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
34b60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
34b70 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
34b80 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
34b90 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
34ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
34bb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34bc0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
34bd0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
34be0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
34bf0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
34c00 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
34c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
34c20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34c30 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
34c40 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
34c50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
34c60 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
34c70 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
34c80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34c90 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
34ca0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
34cb0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
34cc0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
34cd0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
34ce0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
34cf0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
34d00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34d10 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
34d20 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
34d30 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
34d40 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
34d50 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
34d60 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
34d70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
34d80 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
34d90 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
34da0 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
34db0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
34dc0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
34dd0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
34de0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
34df0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
34e00 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
34e10 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
34e20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
34e30 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
34e40 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
34e50 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
34e60 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
34e70 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
34e80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
34e90 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
34ea0 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
34eb0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
34ec0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
34ed0 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
34ee0 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
34ef0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
34f00 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
34f10 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
34f20 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
34f30 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
34f40 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
34f50 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
34f60 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
34f70 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
34f80 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
34f90 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
34fa0 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
34fb0 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
34fc0 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
34fd0 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
34fe0 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
34ff0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
35000 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
35010 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
35020 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
35030 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35040 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
35050 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
35060 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35070 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
35080 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
35090 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
350a0 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
350b0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
350c0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
350d0 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
350e0 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
350f0 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
35100 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
35110 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
35120 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35130 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
35140 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
35150 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35160 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
35170 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
35180 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
35190 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
351a0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
351b0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
351c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
351d0 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
351e0 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
351f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
35200 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
35210 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
35220 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
35230 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
35240 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
35250 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
35260 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
35270 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
35280 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
352a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
352b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
352c0 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
352d0 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
352e0 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
352f0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
35300 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
35310 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
35320 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
35330 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
35340 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
35350 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
35360 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
35370 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
35380 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
35390 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
353a0 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
353b0 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
353c0 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
353d0 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
353e0 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
353f0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
35400 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
35410 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
35420 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
35430 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
35440 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
35450 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
35460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
35470 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
35480 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
35490 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
354a0 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
354b0 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
354c0 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
354d0 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
354e0 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
354f0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
35500 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
35510 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
35520 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
35530 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
35540 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
35550 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
35560 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
35570 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
35580 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
35590 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
355a0 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
355b0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
355c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
355d0 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
355e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
355f0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
35600 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
35610 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
35620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
35630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35640 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
35650 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
35660 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
35670 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
35680 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
35690 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
356a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
356b0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
356c0 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
356d0 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
356e0 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
356f0 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
35700 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
35710 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
35720 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
35730 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
35740 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
35750 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
35760 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
35770 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
35780 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
35790 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
357a0 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
357b0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
357c0 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
357d0 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
357e0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
357f0 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
35800 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
35810 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
35820 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
35830 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
35840 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
35850 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
35860 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
35870 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
35880 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35890 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
358a0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
358b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
358c0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
358d0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
358e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
358f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35900 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
35910 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
35920 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
35930 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
35940 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
35950 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
35960 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35970 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
35980 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
35990 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
359a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
359b0 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
359c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
359d0 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
359e0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
359f0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
35a00 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
35a10 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
35a20 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
35a30 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
35a40 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
35a50 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
35a60 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
35a70 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
35a80 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
35a90 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
35aa0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
35ab0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
35ac0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
35ad0 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
35ae0 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
35af0 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
35b00 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
35b10 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
35b20 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
35b30 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
35b40 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
35b50 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
35b60 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
35b70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
35b80 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
35b90 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
35ba0 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74  unless a write-t
35bb0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
35bc0 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65  lready .  ** bee
35bd0 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a  n started. The j
35be0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
35bf0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
35c00 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  en at this point
35c10 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76  ..  ** It is nev
35c20 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  er called in the
35c30 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20   ERROR state..  
35c40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
35c50 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35c60 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
35c70 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
35c80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35c90 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
35ca0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
35cb0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35cc0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
35cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
35ce0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
35cf0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
35d00 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
35d10 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
35d20 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72   detected, repor
35d30 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  t the same error
35d40 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69  .  ** again. Thi
35d50 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70  s should not hap
35d60 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68 65  pen, but the che
35d70 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62 75  ck provides robu
35d80 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
35d90 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
35da0 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72  rrCode) )  retur
35db0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35dc0 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d  e;..  /* Higher-
35dd0 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e  level routines n
35de0 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66  ever call this f
35df0 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62  unction if datab
35e00 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ase is not.  ** 
35e10 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63  writable.  But c
35e20 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73  heck anyway, jus
35e30 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  t for robustness
35e40 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
35e50 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c  (pPager->readOnl
35e60 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  y) ) return SQLI
35e70 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43  TE_PERM;..  CHEC
35e80 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
35e90 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
35ea0 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
35eb0 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c  opened. Higher l
35ec0 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61  evel routines ha
35ed0 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
35ee0 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63  obtained the nec
35ef0 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20  essary locks to 
35f00 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d  begin the write-
35f10 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
35f20 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61   the.  ** rollba
35f30 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  ck journal might
35f40 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e   not yet be open
35f50 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66  . Open it now if
35f60 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
35f70 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
35f80 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
35f90 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
35fa0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
35fb0 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a  ) on the page. .
35fc0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
35fd0 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20  if it were done 
35fe0 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71  after calling sq
35ff0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
36000 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a  irty(), then.  *
36010 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74  * an error might
36020 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70   occur and the p
36030 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75  ager would end u
36040 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  p in WRITER_LOCK
36050 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69  ED state.  ** wi
36060 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20  th pages marked 
36070 61 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20  as dirty in the 
36080 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
36090 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
360a0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
360b0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20  OCKED ){.    rc 
360c0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
360d0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
360e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
360f0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
36100 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
36110 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
36120 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
36130 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  EMOD );.  assert
36140 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
36150 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36160 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
36170 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
36180 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
36190 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
361a0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
361b0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
361c0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
361d0 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71   away..  */.  sq
361e0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
361f0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
36200 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
36210 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75  Pg) && !subjRequ
36220 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
36230 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
36240 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
36250 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ) );.  }else{.  
36260 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
36270 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
36280 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
36290 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
362a0 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
362b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
362c0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
362d0 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
362e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
362f0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
36300 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
36310 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
36320 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
36330 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
36340 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
36350 29 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  ) && !pagerUseWa
36360 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
36370 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
36380 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
36390 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
363a0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
363b0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20  ->dbOrigSize && 
363c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
363d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  fd) ){.        u
363e0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
363f0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
36400 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66          i64 iOff
36410 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
36420 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20  alOff;..        
36430 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
36440 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
36450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
36460 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
36470 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
36480 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
36490 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
364a0 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
364b0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
364c0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
364d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
364e0 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
364f0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
36500 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73   );..        ass
36510 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
36520 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d  rnalHdr<=pPager-
36530 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
36540 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
36550 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
36560 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
36570 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
36580 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
36590 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
365a0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
365b0 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20  *)pData2);..    
365c0 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
365d0 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
365e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
365f0 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
36600 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
36610 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  age in the block
36620 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20   above, set the 
36630 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66  need-sync flag f
36640 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  or the page..   
36650 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
36660 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  e, when the tran
36670 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
36680 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69  d back, the logi
36690 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  c in.        ** 
366a0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
366b0 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74  e() will think t
366c0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
366d0 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
366e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
366f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36700 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20  e. And if an IO 
36710 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
36720 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20  le doing so,.   
36730 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72       ** then cor
36740 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
36750 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ow..        */. 
36760 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
36770 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
36780 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72  SYNC;..        r
36790 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
367a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
367b0 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
367c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
367d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
367e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
367f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
36800 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
36810 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
36820 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29  ageSize, iOff+4)
36830 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
36850 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
36860 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
36870 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
36880 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  Off+pPager->page
36890 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a  Size+4, cksum);.
368a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
368b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
368c0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
368d0 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
368e0 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
368f0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
36900 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
36910 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
36920 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
36930 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
36940 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
36950 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
36960 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
36970 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
36980 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
36990 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
369a0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
369b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
369c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
369d0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
369e0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
369f0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
36a00 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
36a10 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
36a20 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67  );..        pPag
36a30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
36a40 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  = 8 + pPager->pa
36a50 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
36a60 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
36a70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36a80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36a90 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
36aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
36ab0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
36ac0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
36ad0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
36ae0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
36af0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
36b00 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
36b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
36b20 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
36b30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
36b40 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
36b50 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
36b60 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
36b70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
36b90 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
36ba0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
36bb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
36bc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36be0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
36bf0 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
36c00 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20  R_DBMOD ){.     
36c10 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
36c20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
36c30 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NC;.        }.  
36c40 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
36c50 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
36c60 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
36c70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36c80 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
36c90 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
36ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36cb0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
36cc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
36cd0 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
36ce0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
36cf0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
36d00 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
36d10 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
36d20 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
36d30 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
36d40 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
36d50 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
36d60 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
36d70 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
36d80 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
36d90 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
36da0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
36db0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
36dc0 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
36dd0 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
36de0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
36df0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
36e00 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
36e10 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
36e20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
36e30 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
36e40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
36e50 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
36e60 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
36e70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
36e80 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
36e90 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
36ea0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
36eb0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
36ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36ed0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
36ee0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
36ef0 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
36f00 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
36f10 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20  fore .** making 
36f20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
36f30 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  e. The caller mu
36f40 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
36f50 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  urn value .** of
36f60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
36f70 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
36f80 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20  t to change any 
36f90 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73  page data unless
36fa0 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
36fb0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
36fc0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  _OK..**.** The d
36fd0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
36fe0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
36ff0 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
37000 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
37010 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
37020 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
37030 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
37040 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
37050 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
37060 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
37070 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
37080 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
37090 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
370a0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
370b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
370c0 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
370d0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
370e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
370f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
37100 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
37110 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
37120 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f  s appropriate. O
37130 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
37140 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
37150 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
37160 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
37170 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37180 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
37190 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
371a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
371b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
371c0 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
371d0 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
371e0 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
371f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
37200 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
37210 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
37220 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
37230 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37240 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
37250 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
37260 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37270 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
37280 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
37290 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
372a0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
372b0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
372c0 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
372d0 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
372e0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
372f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
37300 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
37310 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
37320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37330 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
37340 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
37350 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
37360 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
37370 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
37380 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
37390 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
373a0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
373b0 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
373c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
373d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
373e0 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
373f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
37400 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
37410 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
37420 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
37430 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
37440 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20  ncSpill flag to 
37450 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
37460 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
37470 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72  ow.    ** a jour
37480 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65  nal header to be
37490 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
374a0 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
374b0 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  aled by.    ** t
374c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
374d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
374e0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
374f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
37500 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30  oNotSyncSpill==0
37510 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
37520 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b  doNotSyncSpill++
37530 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
37540 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
37550 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
37560 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
37570 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
37580 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
37590 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
375a0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
375b0 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
375c0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
375d0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
375e0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
375f0 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
37600 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
37610 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
37620 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
37630 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
37640 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  unt = pPager->db
37650 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Size;.    if( pP
37660 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
37670 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
37680 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
37690 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
376a0 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
376b0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
376c0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
376d0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
376e0 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
376f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
37700 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
37710 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
37720 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
37730 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
37740 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
37750 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
37760 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
37770 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
37780 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
37790 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
377a0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
377b0 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
377c0 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
377d0 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
377e0 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
377f0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
37800 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
37810 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
37820 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
37830 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
37840 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37850 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
37860 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
37870 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
37880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37890 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
378a0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
378b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
378c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
378d0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
378e0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
378f0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
37900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
37910 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
37920 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
37930 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
37940 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
37950 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
37960 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
37970 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
37980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
37990 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
379a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
379b0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
379c0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
379d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
379e0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
379f0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
37a00 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
37a10 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
37a20 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
37a30 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
37a40 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
37a50 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
37a60 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
37a70 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
37a80 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
37a90 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
37aa0 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
37ab0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
37ac0 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
37ad0 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
37ae0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
37af0 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
37b00 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
37b10 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
37b20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
37b30 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
37b40 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
37b50 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
37b60 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
37b70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64  QLITE_OK && need
37b80 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
37b90 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
37ba0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
37bb0 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  ii<nPage; ii++){
37bc0 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
37bd0 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
37be0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
37bf0 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
37c00 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
37c10 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
37c20 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
37c30 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
37c40 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
37c50 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
37c60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
37c70 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
37c80 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
37c90 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20  Spill==1 );.    
37ca0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
37cb0 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73  cSpill--;.  }els
37cc0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
37cd0 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
37ce0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37cf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
37d00 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
37d10 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
37d20 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
37d30 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
37d40 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
37d50 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
37d60 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
37d70 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
37d80 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
37d90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
37da0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
37db0 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
37dc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
37dd0 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
37de0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
37df0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
37e00 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
37e10 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
37e20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
37e30 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
37e40 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
37e50 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
37e60 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
37e70 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
37e80 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
37e90 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
37ea0 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
37eb0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
37ec0 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
37ed0 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
37ee0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
37ef0 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
37f00 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
37f10 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
37f20 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
37f30 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
37f40 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
37f50 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
37f60 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
37f70 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
37f80 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
37f90 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
37fa0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
37fb0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
37fc0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
37fd0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
37fe0 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
37ff0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
38000 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
38010 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
38020 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
38030 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
38040 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
38050 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
38060 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
38070 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
38080 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
38090 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
380a0 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
380b0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
380c0 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
380d0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
380e0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
380f0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
38100 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
38110 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
38120 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
38130 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
38140 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
38150 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
38160 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
38170 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
38180 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  E;.    pager_set
38190 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
381a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
381b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
381c0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
381d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
381e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
381f0 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  .** change-count
38200 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
38210 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
38220 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69  n integer starti
38230 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f  ng at .** byte o
38240 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
38250 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65  pager file.  The
38260 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67   secondary chang
38270 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20  e counter at.** 
38280 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  92 is also updat
38290 65 64 2c 20 61 73 20 69 73 20 74 68 65 20 53 51  ed, as is the SQ
382a0 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
382b0 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
382c0 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73  ..**.** But this
382d0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
382e0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
382f0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
38300 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54  g is false..** T
38310 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 20 63  o avoid excess c
38320 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  hurning of page 
38330 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e  1, the update on
38340 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e  ly happens once.
38350 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
38360 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
38370 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f 75  ngecounter() rou
38380 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 61  tine that does a
38390 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69 6f  n .** unconditio
383a0 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74 68  nal update of th
383b0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
383c0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
383d0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
383e0 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
383f0 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
38400 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
38410 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
38420 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
38430 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
38440 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
38450 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
38460 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
38470 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
38480 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
38490 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
384a0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
384b0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
384c0 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20  ctMode flag may 
384d0 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  only be non-zero
384e0 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   if the library 
384f0 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20  was compiled.** 
38500 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
38510 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
38520 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ITE macro define
38530 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
38540 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20  .** if isDirect 
38550 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
38560 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
38570 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64  ile is updated d
38580 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72  irectly.** by wr
38590 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64  iting an updated
385a0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
385b0 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20   1 using a call 
385c0 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  to the .** sqlit
385d0 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63  e3OsWrite() func
385e0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
385f0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
38600 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
38610 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
38620 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20  isDirectMode){. 
38630 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
38640 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
38650 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
38660 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
38670 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
38680 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
38690 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
386a0 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
386b0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
386c0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
386d0 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 2