/ Hex Artifact Content
Login

Artifact e1e385e03df0abf0743a7eea38c193d327ed396c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 6f 74 61  codes..**.** ota
7140: 4d 6f 64 65 0a 2a 2a 20 20 20 54 68 69 73 20 76  Mode.**   This v
7150: 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 72 6d 61  ariable is norma
7160: 6c 6c 79 20 30 2e 20 49 74 20 69 73 20 73 65 74  lly 0. It is set
7170: 20 74 6f 20 31 20 62 79 20 74 68 65 20 50 61 67   to 1 by the Pag
7180: 65 72 53 65 74 4f 74 61 4d 6f 64 65 28 29 0a 2a  erSetOtaMode().*
7190: 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61  *   function - a
71a0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
71b0: 22 50 52 41 47 4d 41 20 70 61 67 65 72 5f 6f 74  "PRAGMA pager_ot
71c0: 61 5f 6d 6f 64 65 3d 31 22 20 63 6f 6d 6d 61 6e  a_mode=1" comman
71d0: 64 2e 20 4f 6e 63 65 20 0a 2a 2a 20 20 20 74 68  d. Once .**   th
71e0: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 68 61 73  e *-oal file has
71f0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64   been opened and
7200: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 65 74   it has been det
7210: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
7220: 20 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 20   .**   database 
7230: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
7240: 6e 20 6d 6f 64 69 66 69 65 64 20 73 69 6e 63 65  n modified since
7250: 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2c   it was created,
7260: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 0a   this variable .
7270: 2a 2a 20 20 20 69 73 20 73 65 74 20 74 6f 20 32  **   is set to 2
7280: 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20  ..**.**   It is 
7290: 61 6c 73 6f 20 70 6f 73 73 69 62 6c 65 20 74 6f  also possible to
72a0: 20 75 73 65 20 50 61 67 65 72 53 65 74 4f 74 61   use PagerSetOta
72b0: 4d 6f 64 65 28 29 20 74 6f 20 32 20 69 66 20 74  Mode() to 2 if t
72c0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
72d0: 2a 20 20 20 61 6c 72 65 61 64 79 20 69 6e 20 57  *   already in W
72e0: 41 4c 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  AL mode. In this
72f0: 20 63 61 73 65 20 74 68 65 20 6f 6e 6c 79 20 65   case the only e
7300: 66 66 65 63 74 20 69 73 20 74 6f 20 70 72 65 76  ffect is to prev
7310: 65 6e 74 20 74 68 65 0a 2a 2a 20 20 20 63 6f 6e  ent the.**   con
7320: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 20 63 68 65  nection from che
7330: 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64  ckpointing the d
7340: 62 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  b as part of an 
7350: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
7360: 65 28 29 0a 2a 2a 20 20 20 63 61 6c 6c 2e 0a 2a  e().**   call..*
7370: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
7380: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
7390: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
73a0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
73b0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
73c0: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
73d0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
73e0: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
73f0: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
7400: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
7410: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
7420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
7430: 65 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  e of the PAGER_J
7440: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
7450: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
7460: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7470: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
7480: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
7490: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
74a0: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
74c0: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
74d0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
74e0: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
74f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7500: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7510: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7520: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
7530: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
7540: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
7550: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
7560: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
7570: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
7580: 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61 67    u8 walSyncFlag
7590: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
75a0: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
75b0: 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77 61  SYNC_FULL for wa
75c0: 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75 38  l writes */.  u8
75d0: 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20   syncFlags;     
75e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
75f0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7600: 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 20  _FULL otherwise 
7610: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
7620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7630: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
7640: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
7650: 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20 2a  immutable file *
7660: 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20 20  /.  u8 noLock;  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20 28  /* Do not lock (
7690: 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d 6f  except in WAL mo
76a0: 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  de) */.  u8 read
76b0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
76c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
76d0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
76e0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
76f0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
7700: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7710: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
7720: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 6f  le I/O */.  u8 o
7730: 74 61 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  taMode;         
7740: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
7750: 65 72 6f 20 69 66 20 69 6e 20 6f 74 61 5f 6d 6f  ero if in ota_mo
7760: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a  de */..  /******
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ****.  ** The fo
77c0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
77d0: 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61  ntains those cla
77e0: 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ss members that 
77f0: 63 68 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20  change during.  
7800: 2a 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61  ** routine opera
7810: 74 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d  tion.  Class mem
7820: 62 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73  bers not in this
7830: 20 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65   block are eithe
7840: 72 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65  r fixed.  ** whe
7850: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 66  n the pager is f
7860: 69 72 73 74 20 63 72 65 61 74 65 64 20 6f 72 20  irst created or 
7870: 65 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65  else only change
7880: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
7890: 0a 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e  .  ** significan
78a0: 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73  t mode change (s
78b0: 75 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20  uch as changing 
78c0: 74 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c  the page_size, l
78d0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a  ocking_mode,.  *
78e0: 2a 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * or the journal
78f0: 5f 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e  _mode).  From an
7900: 6f 74 68 65 72 20 76 69 65 77 2c 20 74 68 65 73  other view, thes
7910: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
7920: 64 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68  describe.  ** th
7930: 65 20 22 73 74 61 74 65 22 20 6f 66 20 74 68 65  e "state" of the
7940: 20 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74   pager, while ot
7950: 68 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  her class member
7960: 73 20 64 65 73 63 72 69 62 65 20 74 68 65 0a 20  s describe the. 
7970: 20 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69   ** "configurati
7980: 6f 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65 72  on" of the pager
7990: 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61  ..  */.  u8 eSta
79a0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
79b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
79c0: 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45  ate (OPEN, READE
79d0: 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  R, WRITER_LOCKED
79e0: 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63  ..) */.  u8 eLoc
79f0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
7a00: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
7a10: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74  lock held on dat
7a20: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a30: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
7a40: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
7a50: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
7a60: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
7a70: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
7a80: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
7a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7aa0: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
7ab0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
7ac0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
7ad0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
7ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
7af0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
7b00: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
7b10: 6f 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e  o */.  u8 subjIn
7b20: 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20  Memory;         
7b30: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
7b40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d  e in-memory sub-
7b50: 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67  journals */.  Pg
7b60: 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  no dbSize;      
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7b80: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7b90: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
7ba0: 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a    Pgno dbOrigSiz
7bb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7bc0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
7bd0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
7be0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f  action */.  Pgno
7bf0: 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20   dbFileSize;    
7c00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7c10: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
7c20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
7c30: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69 6e 74  */.  Pgno dbHint
7c40: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
7c50: 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73 65 64   /* Value passed
7c60: 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48   to FCNTL_SIZE_H
7c70: 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  INT call */.  in
7c80: 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20  t errCode;      
7c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
7ca0: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
7cb0: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
7cc0: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ce0: 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64  Pages journalled
7cf0: 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65   since last j-he
7d00: 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ader written */.
7d10: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d30: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
7d40: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
7d50: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
7d60: 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20   u32 nSubRec;   
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d80: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
7d90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62  s written to sub
7da0: 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69  -journal */.  Bi
7db0: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
7dc0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
7dd0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
7de0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
7df0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  se file */.  sql
7e00: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
7e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7e20: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7e30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
7e40: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
7e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7e60: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7e70: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
7e80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7e90: 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *sjfd;         /
7ea0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7eb0: 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  r for sub-journa
7ec0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
7ed0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
7ee0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
7ef0: 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ite offset in th
7f00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
7f10: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
7f20: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
7f30: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
7f40: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
7f50: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73  al header */.  s
7f60: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
7f70: 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f  Backup;    /* Po
7f80: 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66  inter to list of
7f90: 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20   ongoing backup 
7fa0: 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50  processes */.  P
7fb0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
7fc0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
7fd0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
7fe0: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
7ff0: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
8000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8010: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
8020: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
8030: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
8040: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
8050: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
8060: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
8070: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  le changes */.. 
8080: 20 75 38 20 62 55 73 65 46 65 74 63 68 3b 20 20   u8 bUseFetch;  
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
80a0: 54 72 75 65 20 74 6f 20 75 73 65 20 78 46 65 74  True to use xFet
80b0: 63 68 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ch() */.  int nM
80c0: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
80d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
80e0: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
80f0: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
8100: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
8110: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
8120: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
8130: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
8140: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
8150: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
8160: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
8170: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
8180: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
8190: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
81a0: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
81b0: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
81c0: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
81d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8210: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8220: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8230: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
8240: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
8250: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
8260: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
8270: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
8280: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8290: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
82a0: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
82b0: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
82c0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
82d0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
82e0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
82f0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8300: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8310: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8320: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8330: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
8340: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8360: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8370: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
8380: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
8390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
83a0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
83b0: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
83c0: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
83d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
83e0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
83f0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8400: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8410: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8420: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8430: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
8440: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
8450: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
8460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8470: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
8480: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
8490: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
84a0: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
84b0: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
84c0: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
84d0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
84e0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
84f0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8500: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8510: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8530: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
8540: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
8550: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
8560: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
8570: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
8580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
8590: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
85a0: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
85b0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
85c0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
85d0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
85e0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
85f0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8600: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8610: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8620: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8630: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
8640: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
8650: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
8660: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
8670: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
8680: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
8690: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
86a0: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
86b0: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
86c0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
86d0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
86e0: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
86f0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8710: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8720: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8730: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
8740: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
8750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8760: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
8770: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
8780: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
8790: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
87a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
87b0: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
87c0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
87d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
87e0: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8810: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8820: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8830: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
8860: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
8870: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
8880: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
8890: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
88a0: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
88b0: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
88c0: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
88d0: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
88e0: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
88f0: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8900: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8910: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8920: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8930: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
8940: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8950: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
8960: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
8970: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
8980: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
8990: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
89a0: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
89b0: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
89c0: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
89d0: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
89e0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
89f0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8a00: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8a10: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8a20: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8a30: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
8a40: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
8a50: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
8a60: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8a70: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
8a80: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8a90: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8aa0: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8ab0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8ac0: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8ad0: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8ae0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8af0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8b00: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8b10: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8b20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8b30: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8b40: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
8b50: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8b60: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
8b70: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8b80: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
8b90: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8ba0: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8bb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8bc0: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8bd0: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8be0: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8bf0: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8c00: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8c10: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8c20: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8c30: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8c50: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8c60: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8c70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8c80: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8c90: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8ca0: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8cb0: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8cc0: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8cd0: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8ce0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8cf0: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8d00: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8d10: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8d20: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8d30: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8d40: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8d50: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8d60: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8d70: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8d80: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8d90: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8da0: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8db0: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8dc0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8dd0: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8de0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8df0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8e00: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8e10: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8e20: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8e30: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8e40: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8e50: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8e60: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8e70: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8e80: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8e90: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8ea0: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8eb0: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8ec0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8ed0: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8ee0: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8ef0: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8f00: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8f10: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8f20: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8f30: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8f40: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8f50: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8f60: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8f70: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8f80: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8f90: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8fa0: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8fb0: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8fc0: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8fd0: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8fe0: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8ff0: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
9000: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
9010: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
9020: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
9030: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
9040: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
9050: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
9060: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
9070: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
9080: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
9090: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
90a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
90b0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
90c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
90d0: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
90e0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
90f0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
9100: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
9110: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
9120: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
9130: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
9140: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
9150: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
9160: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
9170: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
9180: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
9190: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
91a0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
91b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
91c0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
91d0: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
91e0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
91f0: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9200: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9210: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9220: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9230: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9240: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
9250: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
9260: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
9270: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
9280: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9290: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
92a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
92b0: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
92c0: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
92d0: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
92e0: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
92f0: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9300: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9310: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9320: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9330: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
9340: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
9350: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
9360: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
9370: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9380: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
9390: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
93a0: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
93b0: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
93c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
93d0: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
93e0: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
93f0: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9400: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9410: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9420: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9430: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
9440: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
9450: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9460: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
9470: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
9480: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
9490: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
94a0: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
94b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
94c0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
94d0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
94e0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
94f0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9500: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9510: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9520: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9530: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
9540: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
9550: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
9560: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
9570: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
9580: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
9590: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
95a0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
95b0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
95c0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
95d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
95e0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
95f0: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9600: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9610: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9620: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9630: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
9640: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
9650: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
9660: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
9670: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
9680: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
9690: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
96a0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
96b0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
96c0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
96d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
96e0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
96f0: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
9700: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9710: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
9720: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
9730: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
9740: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
9750: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
9760: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9770: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9780: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30  rames(v,w,x,y) 0
9790: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f  .# define pagerO
97a0: 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
97b0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  z) SQLITE_OK.# d
97c0: 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e  efine pagerBegin
97d0: 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
97e0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
97f0: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
9800: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 6e 74 65  pagerOpenWalInte
9810: 72 6e 61 6c 28 50 61 67 65 72 2a 2c 20 69 6e 74  rnal(Pager*, int
9820: 2a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  *);..#ifndef NDE
9830: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
9840: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
9850: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
9860: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
9870: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9880: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
9890: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
98a0: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
98b0: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
98c0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
98d0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
98e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
98f0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
9900: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
9910: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
9920: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
9930: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
9940: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
9950: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
9960: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
9970: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
9980: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
9990: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
99a0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
99b0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
99c0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
99d0: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
99e0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
99f0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
9a00: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9a10: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9a20: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9a30: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9a40: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
9a50: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
9a60: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9a70: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
9a80: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
9a90: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9aa0: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9ab0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
9ac0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9ad0: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
9ae0: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
9af0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
9b00: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
9b10: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9b20: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9b30: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
9b40: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9b50: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
9b60: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9b70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9b80: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
9b90: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9ba0: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9bb0: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
9bc0: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
9bd0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
9be0: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
9bf0: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
9c00: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
9c10: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9c20: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9c30: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9c40: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9c50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c60: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9c70: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9c90: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9ca0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9cb0: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
9cc0: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
9cd0: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
9ce0: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
9cf0: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
9d00: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
9d10: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9d20: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9d30: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9d40: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9d50: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9d60: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9d70: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9d80: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9d90: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9da0: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9db0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9dc0: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
9dd0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9de0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9df0: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
9e00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
9e10: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9e20: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9e30: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9e40: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9e50: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9e60: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9e70: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9e80: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9e90: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9ea0: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9eb0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e  assert( p->noSyn
9ec0: 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
9ed0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9ee0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9ef0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
9f00: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9f10: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9f20: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9f30: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
9f40: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9f50: 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53  R_ERROR && p->eS
9f60: 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
9f70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f80: 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d  pagerUseWal(p)==
9f90: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
9fa0: 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  f changeCountDon
9fb0: 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45  e is set, a RESE
9fc0: 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65  RVED lock or gre
9fd0: 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
9fe0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69  d.  ** on the fi
9ff0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
a000: 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  t( pPager->chang
a010: 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c  eCountDone==0 ||
a020: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
a030: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
a040: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c  .  assert( p->eL
a050: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
a060: 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  K );..  switch( 
a070: 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  p->eState ){.   
a080: 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e   case PAGER_OPEN
a090: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a0a0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
a0b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0c0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a0d0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a0e0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a0f0: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a100: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c  ->pPCache)==0 ||
a110: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
a120: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a130: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a140: 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20  R_READER:.      
a150: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a160: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a170: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a180: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a190: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a1b0: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
a1c0: 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  K );.      break
a1d0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a1e0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a  R_WRITER_LOCKED:
a1f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a200: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a210: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a220: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a230: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a240: 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  K );.      if( !
a250: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a260: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  er) ){.        a
a270: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a280: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
a290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a2b0: 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  dbSize==pPager->
a2c0: 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
a2d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2e0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a2f0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
a300: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a310: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a320: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a330: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
a340: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a350: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
a360: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a370: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a380: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a390: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a3a0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a3b0: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a3c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3d0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a3e0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a3f0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a400: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a410: 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  /* It is possibl
a420: 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e 61  e that if journa
a430: 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65 20  l_mode=wal here 
a440: 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68 65  that neither the
a450: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
a460: 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68 65  nal file nor the
a470: 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f 70   WAL file are op
a480: 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  en. This happens
a490: 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20 20   during.        
a4a0: 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72  ** a rollback tr
a4b0: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
a4c0: 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75  witches from jou
a4d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20  rnal_mode=off.  
a4e0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72        ** to jour
a4f0: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20  nal_mode=wal..  
a500: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a510: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a520: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
a530: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
a540: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a550: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
a560: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a570: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a580: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a590: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a5a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a5b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a5c0: 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
a5d0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
a5e0: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a5f0: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a600: 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  bFileSize );.   
a610: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a620: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a630: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
a640: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a650: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a660: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a  R_WRITER_DBMOD:.
a670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a680: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a690: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a6a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a6b0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a6c0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a6d0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a6e0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a6f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a700: 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck>=EXCLUSIVE_LO
a710: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a720: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a730: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a740: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a750: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a760: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a770: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a780: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a790: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a7a0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
a7b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a7c0: 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d  rigSize<=pPager-
a7d0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a7e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a7f0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a800: 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20  ER_FINISHED:.   
a810: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a820: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a830: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a850: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a860: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a870: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a880: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
a890: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a8a0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a8b0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a8c0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a8d0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a8e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a8f0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a900: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a910: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a920: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a930: 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20   PAGER_ERROR:.  
a940: 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73      /* There mus
a950: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
a960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  e outstanding re
a970: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
a980: 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a  ager if.      **
a990: 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e   in ERROR state.
a9a0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 70   Otherwise the p
a9b0: 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ager should have
a9c0: 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64   already dropped
a9d0: 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74  .      ** back t
a9e0: 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  o OPEN state..  
a9f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
aa00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
aa10: 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
aa20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
aa30: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
aa40: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
aa50: 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20 20  PCache)>0 );.   
aa60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
aa70: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
aa80: 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e 44  dif /* ifndef ND
aa90: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
aaa0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f 2a  SQLITE_DEBUG ./*
aab0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
aac0: 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e 20  nter to a human 
aad0: 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67 20  readable string 
aae0: 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66 66  in a static buff
aaf0: 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  er.** containing
ab00: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
ab10: 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
ab20: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
ab30: 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69 73  ment. This.** is
ab40: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
ab50: 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62 75  used within debu
ab60: 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ggers. For examp
ab70: 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72 6e  le, as an altern
ab80: 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72 69  ative.** to "pri
ab90: 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20 67  nt *pPager" in g
aba0: 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29 20  db:.**.** (gdb) 
abb0: 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72 69  printf "%s", pri
abc0: 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  nt_pager_state(p
abd0: 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63  Pager).*/.static
abe0: 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61 67   char *print_pag
abf0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
ac00: 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  p){.  static cha
ac10: 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20  r zRet[1024];.. 
ac20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ac30: 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20  f(1024, zRet,.  
ac40: 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20      "Filename:  
ac50: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
ac60: 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20 20  "State:         
ac70: 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22  %s errCode=%d\n"
ac80: 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20  .      "Lock:   
ac90: 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20         %s\n".   
aca0: 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65     "Locking mode
acb0: 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  :  locking_mode=
acc0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75  %s\n".      "Jou
acd0: 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72  rnal mode:  jour
ace0: 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  nal_mode=%s\n". 
acf0: 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73 74       "Backing st
ad00: 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64  ore: tempFile=%d
ad10: 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75   memDb=%d useJou
ad20: 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20  rnal=%d\n".     
ad30: 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20   "Journal:      
ad40: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64   journalOff=%lld
ad50: 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64   journalHdr=%lld
ad60: 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65 3a  \n".      "Size:
ad70: 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a 65            dbsize
ad80: 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d 25  =%d dbOrigSize=%
ad90: 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c  d dbFileSize=%d\
ada0: 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46  n".      , p->zF
adb0: 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20  ilename.      , 
adc0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
add0: 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20  _OPEN           
ade0: 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20   ? "OPEN" :.    
adf0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ae00: 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20 20  AGER_READER     
ae10: 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22 20       ? "READER" 
ae20: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ae30: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
ae40: 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57 52  R_LOCKED   ? "WR
ae50: 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20  ITER_LOCKED" :. 
ae60: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ae70: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
ae80: 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54 45  ACHEMOD ? "WRITE
ae90: 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20  R_CACHEMOD" :.  
aea0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aeb0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
aec0: 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45 52  MOD    ? "WRITER
aed0: 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  _DBMOD" :.      
aee0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
aef0: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
af00: 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49 4e  ED ? "WRITER_FIN
af10: 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20 20  ISHED" :.       
af20: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
af30: 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20  R_ERROR         
af40: 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22 3f    ? "ERROR" : "?
af50: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
af60: 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a  (int)p->errCode.
af70: 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b        , p->eLock
af80: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20  ==NO_LOCK       
af90: 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a    ? "NO_LOCK" :.
afa0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
afb0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
afc0: 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a    ? "RESERVED" :
afd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
afe0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
aff0: 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22  K  ? "EXCLUSIVE"
b000: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
b010: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
b020: 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22 20       ? "SHARED" 
b030: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
b040: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
b050: 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20      ? "UNKNOWN" 
b060: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b070: 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65    , p->exclusive
b080: 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76  Mode ? "exclusiv
b090: 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20  e" : "normal".  
b0a0: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
b0b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b0c0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
b0d0: 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20   ? "memory" :.  
b0e0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b0f0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b100: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
b110: 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20   ? "off" :.     
b120: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b130: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b140: 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20  MODE_DELETE   ? 
b150: 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20  "delete" :.     
b160: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
b170: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
b180: 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20  MODE_PERSIST  ? 
b190: 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20  "persist" :.    
b1a0: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b1b0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b1c0: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f  LMODE_TRUNCATE ?
b1d0: 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20   "truncate" :.  
b1e0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b1f0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b200: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
b210: 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72   ? "wal" : "?err
b220: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
b230: 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28  t)p->tempFile, (
b240: 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69  int)p->memDb, (i
b250: 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  nt)p->useJournal
b260: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
b270: 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e  nalOff, p->journ
b280: 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28 69  alHdr.      , (i
b290: 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69  nt)p->dbSize, (i
b2a0: 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65  nt)p->dbOrigSize
b2b0: 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65  , (int)p->dbFile
b2c0: 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74  Size.  );..  ret
b2d0: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
b2e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
b2f0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
b300: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
b310: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
b320: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b330: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
b340: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
b350: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b360: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
b370: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
b380: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
b390: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
b3a0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
b3b0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
b3c0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
b3d0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
b3e0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
b3f0: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
b400: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
b410: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
b420: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
b430: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b440: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
b450: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
b460: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
b470: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b480: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b490: 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72  >pPager;.  Pager
b4a0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20  Savepoint *p;.  
b4b0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b4c0: 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a  >pgno;.  int i;.
b4d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b4e0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b4f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
b500: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b510: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b520: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b530: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b540: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b550: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b570: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b580: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
b590: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b5a0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b5b0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b5c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b5d0: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b5e0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b5f0: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b600: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b610: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b620: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b630: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
b640: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
b650: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
b660: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
b670: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
b680: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
b690: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
b6a0: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
b6b0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
b6c0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
b6d0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
b6e0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b6f0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
b700: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
b710: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
b720: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
b730: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
b740: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
b750: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
b760: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
b770: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b780: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
b790: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
b7a0: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
b7b0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
b7c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b7d0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
b7e0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
b7f0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
b800: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b810: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
b820: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
b830: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
b840: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
b850: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
b860: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
b870: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
b880: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a  ((u8*)A,B).../*.
b890: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b8a0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
b8b0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
b8c0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
b8d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
b8e0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
b8f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
b900: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
b910: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
b920: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
b930: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b940: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b950: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
b960: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
b970: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
b980: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
b990: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
b9a0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  set);.}../*.** U
b9b0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
b9c0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b9d0: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b9e0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
b9f0: 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45  LOCK.** or SHARE
ba00: 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65  D_LOCK. Regardle
ba10: 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
ba20: 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f   not the call to
ba30: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75   xUnlock().** su
ba40: 63 63 65 65 64 73 2c 20 73 65 74 20 74 68 65 20  cceeds, set the 
ba50: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
ba60: 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68  able to match th
ba70: 65 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65  e (attempted) ne
ba80: 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78  w lock..**.** Ex
ba90: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
baa0: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
bab0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
bac0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
bad0: 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20  s.** called, do 
bae0: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53  not modify it. S
baf0: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
bb00: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
bb10: 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f   of .** UNKNOWN_
bb20: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
bb30: 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e  anation of this.
bb40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
bb50: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67  agerUnlockDb(Pag
bb60: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
bb70: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
bb80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
bb90: 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
bba0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
bbb0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
bbc0: 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73  ==eLock );.  ass
bbd0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ert( eLock==NO_L
bbe0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48  OCK || eLock==SH
bbf0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
bc00: 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f  ssert( eLock!=NO
bc10: 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73  _LOCK || pagerUs
bc20: 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
bc30: 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
bc40: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
bc50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
bc60: 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20  r->eLock>=eLock 
bc70: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  );.    rc = pPag
bc80: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
bc90: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
bca0: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
bcb0: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
bcc0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bcd0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
bce0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bcf0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bd00: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  ock;.    }.    I
bd10: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
bd20: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
bd30: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20  , eLock)).  }.  
bd40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bd50: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74  .** Lock the dat
bd60: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
bd70: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
bd80: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
bd90: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SHARED_LOCK,.** 
bda0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
bdb0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
bdc0: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
bdd0: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  s successful, se
bde0: 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65  t the.** Pager.e
bdf0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
be00: 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67   the new locking
be10: 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45   state. .**.** E
be20: 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e  xcept, if Pager.
be30: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
be40: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65  UNKNOWN_LOCK whe
be50: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
be60: 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64  is .** called, d
be70: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20  o not modify it 
be80: 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c  unless the new l
be90: 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20  ocking state is 
bea0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
beb0: 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  .** See the comm
bec0: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
bed0: 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e  efine of UNKNOWN
bee0: 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
bef0: 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20  lanation .** of 
bf00: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
bf10: 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  int pagerLockDb(
bf20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
bf30: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
bf40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bf50: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ..  assert( eLoc
bf60: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
bf70: 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  | eLock==RESERVE
bf80: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
bf90: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
bfa0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
bfb0: 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20  >eLock<eLock || 
bfc0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
bfd0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
bfe0: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
bff0: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
c000: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f  OK : sqlite3OsLo
c010: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
c020: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
c030: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c040: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
c050: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
c060: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c070: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
c080: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c090: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
c0a0: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
c0b0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
c0c0: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
c0d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c0e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c0f0: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
c100: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
c110: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
c120: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
c130: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
c140: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
c150: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c160: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
c170: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
c180: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c190: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c1a0: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
c1b0: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
c1c0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
c1d0: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
c1e0: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
c1f0: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
c200: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c210: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
c220: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
c230: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
c240: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
c250: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
c260: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
c270: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
c280: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
c290: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
c2a0: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
c2b0: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
c2c0: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
c2d0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
c2e0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
c2f0: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
c300: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
c310: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
c320: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
c330: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
c340: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c350: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
c360: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c370: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
c380: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
c390: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
c3a0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
c3b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c3c0: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
c3d0: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
c3e0: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
c3f0: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
c400: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
c410: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
c420: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
c430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c450: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
c460: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
c470: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c490: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
c4a0: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
c4d0: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
c4e0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
c4f0: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
c500: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
c510: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
c520: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
c530: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
c540: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
c550: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
c560: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
c570: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
c580: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
c590: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
c5a0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c5b0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
c5c0: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
c5d0: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
c5e0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c5f0: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
c600: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
c610: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
c620: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
c630: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
c640: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c650: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
c660: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
c670: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
c680: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c690: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c6a0: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c6b0: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c6c0: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c6d0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c6e0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c6f0: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c700: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c710: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c720: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c730: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c740: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c750: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c760: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c770: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c780: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c790: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c7a0: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c7b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c7d0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c7e0: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c7f0: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c800: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c810: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c820: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c830: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c840: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c850: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c860: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c870: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c880: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c890: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c8a0: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c8b0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c8c0: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c8d0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c8e0: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c8f0: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c900: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c910: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c920: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c930: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c940: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c950: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c960: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c970: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c980: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c990: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c9a0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c9b0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c9c0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c9d0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c9e0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c9f0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
ca00: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
ca10: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
ca20: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
ca30: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
ca40: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
ca50: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
ca60: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
ca70: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
ca80: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
ca90: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
caa0: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
cab0: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
cac0: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
cad0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
cae0: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
caf0: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
cb00: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
cb10: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
cb20: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
cb30: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
cb40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
cb50: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
cb60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
cb70: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
cb80: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
cb90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
cba0: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
cbb0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cbc0: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
cbd0: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
cbe0: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
cbf0: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
cc00: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
cc10: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
cc20: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
cc30: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
cc40: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
cc50: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
cc60: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
cc70: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
cc80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cc90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
cca0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
ccb0: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
ccc0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
ccd0: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
cce0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
ccf0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
cd00: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
cd10: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
cd20: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
cd30: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
cd40: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
cd50: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
cd60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cd70: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
cd80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
cd90: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
cda0: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
cdb0: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
cdc0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
cdd0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
cde0: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
cdf0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
ce00: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
ce10: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
ce20: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
ce30: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
ce40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce50: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
ce60: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
ce70: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
ce80: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
ce90: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
cea0: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
ceb0: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
cec0: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
ced0: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
cee0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
cef0: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
cf00: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
cf10: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
cf20: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
cf30: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
cf40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cf50: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
cf60: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
cf70: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
cf80: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
cf90: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
cfa0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
cfb0: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
cfc0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
cfd0: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
cfe0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
cff0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
d000: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
d010: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
d020: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
d030: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
d040: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
d050: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
d060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d070: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
d080: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
d0a0: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
d0b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d0c0: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
d0f0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
d100: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
d110: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
d140: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
d150: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
d160: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
d170: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
d180: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
d190: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d1a0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
d1b0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
d1c0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
d1d0: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
d1e0: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
d1f0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
d200: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
d210: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
d220: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
d230: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
d240: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d250: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d260: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
d270: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
d280: 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c   || len==0 .   |
d290: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d2a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d2b0: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
d2c0: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
d2d0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d2e0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d2f0: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
d300: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
d310: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
d320: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
d330: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d340: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d350: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
d360: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
d370: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
d380: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
d390: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
d3a0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
d3b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d3c0: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
d3d0: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
d3e0: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
d3f0: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
d400: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
d410: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
d420: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
d430: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
d440: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
d450: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
d460: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
d470: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d480: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
d490: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
d4a0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
d4b0: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
d4c0: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
d4d0: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
d4e0: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
d4f0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
d500: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
d510: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
d520: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
d530: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
d540: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d550: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d560: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
d570: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
d580: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
d590: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
d5a0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
d5b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d5c0: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
d5d0: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
d5e0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
d5f0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
d600: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
d610: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
d620: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
d630: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
d640: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
d650: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
d660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
d6a0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
d6b0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
d6c0: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
d6e0: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
d710: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
d720: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
d730: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
d740: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
d750: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
d760: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
d770: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
d780: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
d790: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
d7a0: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
d7b0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
d7c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d7d0: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
d7e0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
d7f0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
d800: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
d810: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
d820: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d830: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
d840: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
d850: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d860: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d870: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d880: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d890: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d8a0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d8b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d8c0: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d8d0: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d8e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d8f0: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d900: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d910: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d920: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d930: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d940: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d950: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d960: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d970: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d980: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d990: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d9a0: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d9b0: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d9c0: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d9d0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d9e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d9f0: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
da00: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
da10: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
da20: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
da30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
da40: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
da50: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
da60: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
da70: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
da80: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
da90: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
daa0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
dab0: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
dac0: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
dad0: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
dae0: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
daf0: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
db00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
db10: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
db20: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
db30: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
db40: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
db50: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
db60: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
db70: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
db80: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
db90: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
dba0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
dbb0: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
dbc0: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
dbd0: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
dbe0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
dbf0: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
dc00: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
dc10: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
dc20: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
dc30: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
dc40: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
dc50: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
dc60: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
dc70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
dca0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
dcb0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
dcc0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
dcd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
dce0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
dcf0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
dd00: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
dd10: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
dd20: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
dd30: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
dd40: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
dd50: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
dd60: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
dd70: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
dd80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
dd90: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
dda0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
ddb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ddc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
ddd0: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
dde0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
ddf0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
de00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
de10: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
de20: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
de30: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
de40: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
de50: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
de60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de70: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
de80: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
de90: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
dea0: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
deb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
dec0: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
ded0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
dee0: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
def0: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
df00: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
df10: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
df20: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
df30: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
df40: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
df50: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
df60: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
df70: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
df80: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
df90: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
dfa0: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
dfb0: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
dfc0: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
dfd0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
dfe0: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
dff0: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
e000: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
e010: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
e020: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
e030: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
e040: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
e050: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
e060: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
e070: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
e080: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e090: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
e0a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e0b0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
e0c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
e0d0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
e0e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e0f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
e100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
e110: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
e120: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e130: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
e140: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
e150: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
e160: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
e170: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e180: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
e190: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
e1a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
e1b0: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
e1c0: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
e1d0: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
e1e0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
e1f0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
e200: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
e210: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
e220: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
e230: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
e240: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
e250: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
e260: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
e270: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
e280: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
e290: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
e2a0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
e2b0: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
e2c0: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
e2d0: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
e2e0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
e2f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
e300: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
e310: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
e320: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
e330: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
e340: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
e350: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
e360: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
e370: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e380: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e390: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e3a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e3b0: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
e3c0: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
e3d0: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
e3e0: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
e3f0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
e400: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
e410: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
e420: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
e430: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
e440: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
e450: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
e460: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e480: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
e490: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
e4a0: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e4d0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
e4e0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e4f0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
e500: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
e510: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
e520: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
e530: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
e540: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
e550: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
e560: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
e570: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
e580: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
e590: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
e5a0: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
e5b0: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
e5c0: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
e5d0: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
e5e0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
e5f0: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
e600: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
e610: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
e620: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
e630: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
e640: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
e650: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
e660: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e670: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e680: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
e690: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e6a0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
e6b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e6c0: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
e6d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e6e0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
e6f0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
e700: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
e710: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
e720: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
e730: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
e740: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
e750: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
e760: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
e770: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
e780: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
e790: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
e7a0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
e7b0: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
e7c0: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
e7d0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e7e0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
e7f0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
e800: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
e810: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
e820: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
e830: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
e840: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
e850: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
e860: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
e870: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
e880: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
e890: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
e8a0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
e8b0: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
e8c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
e8d0: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
e8e0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
e8f0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
e900: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e910: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
e920: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
e930: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
e940: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
e950: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
e960: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e970: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
e980: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e990: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
e9a0: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
e9b0: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
e9c0: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
e9d0: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
e9e0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
e9f0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
ea00: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
ea10: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
ea20: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
ea30: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
ea40: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
ea50: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
ea60: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
ea70: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
ea80: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
ea90: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
eaa0: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
eab0: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
eac0: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
ead0: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
eae0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
eaf0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
eb00: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
eb10: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
eb20: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
eb30: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
eb40: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
eb50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
eb60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
eb70: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
eb80: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
eb90: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
eba0: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
ebb0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
ebc0: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
ebd0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
ebe0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
ebf0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ec00: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
ec10: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ec20: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ec30: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
ec40: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
ec50: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
ec60: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
ec70: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
ec80: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
ec90: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
eca0: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20  itializer */ .  
ecb0: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
ecc0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
ecd0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
ece0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ecf0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
ed00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
ed10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
ed20: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
ed30: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
ed40: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
ed50: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
ed60: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ed70: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ed80: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
ed90: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
eda0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
edb0: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
edc0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
edd0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
ede0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
edf0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
ee00: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
ee10: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
ee20: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
ee30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ee40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ee50: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
ee60: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
ee70: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
ee80: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
ee90: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
eea0: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
eeb0: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
eec0: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
eed0: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
eee0: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
eef0: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
ef00: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
ef10: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
ef20: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
ef30: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
ef40: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
ef50: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
ef60: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
ef70: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
ef80: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ef90: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
efa0: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
efb0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
efc0: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
efd0: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
efe0: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
eff0: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
f000: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
f010: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f020: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
f030: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
f040: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
f050: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
f060: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
f070: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
f080: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
f090: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
f0a0: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
f0b0: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
f0c0: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
f0d0: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
f0e0: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
f0f0: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
f100: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
f110: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
f120: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
f130: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
f140: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
f150: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
f160: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
f170: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
f180: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
f190: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
f1a0: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
f1b0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
f1c0: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
f1d0: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
f1e0: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
f1f0: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
f200: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
f210: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
f220: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
f230: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
f240: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
f250: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
f260: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
f270: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
f280: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
f290: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
f2a0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
f2b0: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
f2c0: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
f2d0: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
f2e0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
f2f0: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
f300: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
f310: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
f320: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
f330: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
f340: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
f350: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
f360: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
f370: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
f380: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
f390: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f3a0: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
f3b0: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
f3c0: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
f3d0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
f3e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f3f0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
f400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f410: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
f420: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
f430: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
f440: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
f450: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f460: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
f470: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
f480: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
f490: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
f4a0: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
f4b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f4c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
f4d0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
f4e0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
f4f0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
f500: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
f510: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
f520: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
f530: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
f540: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
f550: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
f560: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
f570: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
f580: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
f590: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
f5a0: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
f5b0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
f5c0: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
f5d0: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
f5e0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
f5f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f600: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
f610: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
f620: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
f630: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
f640: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
f650: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
f660: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
f670: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
f680: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
f690: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
f6a0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
f6b0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
f6c0: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
f6d0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
f6e0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
f6f0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
f700: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
f710: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f720: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
f730: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
f740: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
f750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f760: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
f770: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
f780: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
f790: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
f7a0: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
f7b0: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
f7c0: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
f7d0: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
f7e0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
f7f0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f800: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
f810: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
f820: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f830: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
f840: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f860: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
f870: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
f880: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
f890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f8a0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
f8b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
f8c0: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
f8d0: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f8f0: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
f900: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
f910: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
f940: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
f950: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
f960: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f990: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
f9a0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
f9b0: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
f9c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
f9d0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
f9e0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fa00: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
fa10: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
fa20: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
fa30: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
fa40: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
fa50: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
fa60: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
fa70: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
fa80: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
fa90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
faa0: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
fab0: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
fac0: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
fad0: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
fae0: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
faf0: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
fb00: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
fb10: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
fb20: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
fb30: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
fb40: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
fb50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
fb60: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
fb70: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
fb80: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
fb90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fba0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
fbb0: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
fbc0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
fbd0: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
fbe0: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
fbf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fc00: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
fc10: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
fc20: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
fc30: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
fc40: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
fc50: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
fc60: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
fc70: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
fc80: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
fc90: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fca0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
fcb0: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
fcc0: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
fcd0: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
fce0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
fcf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fd00: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
fd10: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
fd20: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
fd30: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
fd40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fd50: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
fd60: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
fd70: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
fd80: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
fd90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
fda0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fdb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fdc0: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
fdd0: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
fde0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
fdf0: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
fe00: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
fe10: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
fe20: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
fe30: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
fe40: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
fe50: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
fe60: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
fe70: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
fe80: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
fe90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
fea0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
feb0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fec0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
fed0: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
fee0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fef0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff00: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
ff10: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
ff20: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
ff30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ff40: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff50: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
ff60: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
ff70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
ff80: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
ff90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
ffa0: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
ffb0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
ffc0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
ffd0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
ffe0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
fff0: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
10000 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
10010 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
10020 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
10030 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
10040 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
10050 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
10060 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
10070 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
10080 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
10090 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
100a0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
100b0 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
100c0 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
100d0 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
100e0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
100f0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10100 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
10110 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
10120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10130 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
10140 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
10150 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
10160 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
10170 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
10180 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
10190 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
101a0 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
101b0 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
101c0 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
101d0 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
101e0 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
101f0 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
10200 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
10210 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
10220 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
10230 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10240 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
10250 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
10260 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
10270 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10280 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
10290 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
102a0 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
102b0 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
102c0 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
102d0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
102e0 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
102f0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
10300 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
10310 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
10320 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
10330 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
10340 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
10350 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
10360 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
10370 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
10380 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
10390 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
103a0 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
103b0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
103c0 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
103d0 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
103e0 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
103f0 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
10400 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
10410 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
10420 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
10430 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
10440 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
10450 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
10460 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
10470 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10480 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
10490 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
104a0 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
104b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
104c0 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
104d0 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
104e0 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
104f0 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
10500 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
10510 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
10520 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
10530 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
10540 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10550 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10560 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
10570 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
10580 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10590 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
105a0 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
105b0 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
105c0 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
105d0 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
105e0 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
105f0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
10600 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
10610 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
10620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10630 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10640 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
10650 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
10660 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
10670 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
10680 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
10690 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
106a0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
106b0 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
106c0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
106d0 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
106e0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
106f0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
10700 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
10710 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
10720 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
10730 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
10740 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
10750 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
10760 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
10770 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
10780 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
10790 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
107a0 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
107b0 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
107c0 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
107d0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
107e0 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
107f0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
10800 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10810 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10820 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10830 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10840 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
10850 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
10860 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
10870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10880 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
10890 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
108a0 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
108b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108c0 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
108d0 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
108e0 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
108f0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
10900 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
10910 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
10920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
10930 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10940 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
10950 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
10960 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
10970 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
10980 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
10990 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
109a0 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
109b0 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
109c0 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
109d0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
109e0 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
109f0 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
10a00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10a10 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
10a20 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
10a30 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
10a40 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
10a50 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
10a60 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
10a70 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
10a80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
10a90 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
10aa0 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
10ab0 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
10ac0 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
10ad0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
10ae0 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
10af0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
10b00 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
10b10 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
10b20 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
10b30 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
10b40 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
10b50 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
10b60 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
10b70 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
10b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10b90 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
10ba0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10bb0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10bc0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
10bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10bf0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10c00 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
10c30 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
10c40 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
10c70 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
10c80 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
10c90 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10cb0 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
10cc0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
10cd0 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
10d00 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
10d10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
10d20 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
10d30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10d40 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
10d50 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
10d60 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
10d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10d80 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10d90 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
10da0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
10db0 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20  er->jfd).  ){.  
10dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10dd0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
10de0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
10df0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10e00 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
10e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e20 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
10e30 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
10e40 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
10e50 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
10e60 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
10e70 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
10e80 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
10e90 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
10ea0 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
10eb0 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
10ec0 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
10ed0 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
10ee0 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
10ef0 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
10f00 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
10f10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10f20 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
10f30 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
10f40 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
10f50 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
10f60 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
10f70 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
10f80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
10f90 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
10fa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10fb0 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
10fc0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
10fd0 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
10fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10ff0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
11000 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11010 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
11020 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
11030 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
11040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
11050 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11060 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11070 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
11080 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11090 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
110a0 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
110b0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
110c0 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
110d0 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
110e0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
110f0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
11100 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
11110 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11120 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
11130 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11140 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
11150 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
11160 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11170 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11180 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11190 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
111a0 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
111b0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
111c0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
111d0 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
111e0 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
111f0 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
11200 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11210 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
11220 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
11230 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20  ster+20);..  /* 
11240 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11250 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75  in peristent-jou
11260 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20  rnal mode, then 
11270 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20  the physical .  
11280 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ** journal-file 
11290 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20  may extend past 
112a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
112b0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
112c0 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79  me.  ** and 8 by
112d0 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74  tes of magic dat
112e0 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74  a just written t
112f0 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  o the file. This
11300 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72   is .  ** danger
11310 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ous because the 
11320 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  code to rollback
11330 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
11340 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ile.  ** will no
11350 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e  t be able to fin
11360 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  d the master-jou
11370 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74  rnal name to det
11380 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
11390 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
113a0 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20  journal is hot. 
113b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65  .  **.  ** Easie
113c0 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69  st thing to do i
113d0 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
113e0 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  is to truncate t
113f0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
11400 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71   file to the req
11410 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f  uired size..  */
11420 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f   .  if( SQLITE_O
11430 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
11440 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
11450 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
11460 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  e)).   && jrnlSi
11470 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ze>pPager->journ
11480 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  alOff.  ){.    r
11490 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
114a0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
114b0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
114c0 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65  alOff);.  }.  re
114d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
114e0 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e  * Discard the en
114f0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
11500 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
11510 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  age-cache..*/.st
11520 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
11530 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
11540 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  ger){.  sqlite3B
11550 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
11560 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
11570 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
11580 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
11590 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  che);.}../*.** F
115a0 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
115b0 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
115c0 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
115d0 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
115e0 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
115f0 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11600 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11610 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11620 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11630 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
11640 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11650 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
11660 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11670 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
11680 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
11690 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
116b0 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
116c0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
116d0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
116e0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
116f0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11700 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
11710 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11720 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
11730 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
11740 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
11750 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
11760 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
11770 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
11780 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  l(pPager->sjfd) 
11790 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
117a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
117b0 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
117c0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
117d0 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
117e0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
117f0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11800 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
11810 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
11820 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
11830 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
11840 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
11850 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
11860 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
11870 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
11880 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
11890 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
118a0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
118b0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
118c0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
118d0 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
118e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
118f0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
11900 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
11910 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
11920 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11930 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11940 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
11950 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11960 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
11970 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
11980 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
11990 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
119a0 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
119b0 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
119c0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
119d0 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
119e0 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
119f0 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
11a00 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
11a10 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
11a20 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
11a30 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
11a40 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
11a50 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
11a60 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
11a70 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
11a80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
11a90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11aa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11ab0 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11ac0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11ad0 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11ae0 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11af0 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11b00 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11b10 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11b20 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11b30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11b40 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11b50 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
11b60 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
11b70 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
11b80 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
11b90 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
11ba0 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
11bb0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
11bc0 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
11bd0 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
11be0 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
11bf0 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
11c00 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
11c10 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
11c20 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
11c30 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
11c40 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
11c50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11c60 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
11c70 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
11c80 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
11c90 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
11ca0 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
11cb0 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
11cc0 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
11cd0 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
11ce0 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11cf0 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
11d00 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
11d10 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
11d20 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
11d30 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
11d40 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
11d50 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
11d60 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
11d70 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11d80 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
11d90 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
11da0 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
11db0 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
11dc0 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
11dd0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
11de0 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
11df0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e00 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
11e10 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11e20 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
11e30 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11e40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11e50 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
11e60 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11e70 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
11e80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
11e90 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
11ea0 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   0;.  releaseAll
11eb0 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
11ec0 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  r);..  if( pager
11ed0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11ee0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
11ef0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
11f00 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d) );.    sqlite
11f10 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
11f20 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
11f30 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Wal);.    pPager
11f40 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
11f50 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
11f60 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11f70 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
11f80 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fa0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74  * Error code ret
11fb0 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e  urned by pagerUn
11fc0 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20  lockDb() */.    
11fd0 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
11fe0 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
11ff0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
12000 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
12010 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
12020 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
12030 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
12040 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
12050 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
12060 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
12070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
12080 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
12090 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
120a0 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
120b0 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
120c0 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
120d0 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
120e0 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
120f0 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
12100 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
12110 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12120 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12130 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
12140 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12150 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12160 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
12170 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12180 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12190 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
121a0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
121b0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
121c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
121d0 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
121e0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
121f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
12200 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
12210 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12220 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12230 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
12240 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
12250 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
12260 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
12270 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
12280 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
12290 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
122a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
122b0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
122c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
122d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
122e0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
122f0 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
12300 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f  the call to unlo
12310 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
12320 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c      ** file fail
12330 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65  s, set the curre
12340 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f  nt lock to UNKNO
12350 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65  WN_LOCK. See the
12360 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   comment.    ** 
12370 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
12380 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  e for UNKNOWN_LO
12390 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
123a0 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69  ation of why thi
123b0 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65  s.    ** is nece
123c0 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
123d0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f    rc = pagerUnlo
123e0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f  ckDb(pPager, NO_
123f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
12400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
12410 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12420 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20  PAGER_ERROR ){. 
12430 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
12440 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ck = UNKNOWN_LOC
12450 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
12460 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65   The pager state
12470 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20   may be changed 
12480 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52  from PAGER_ERROR
12490 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68   to PAGER_OPEN h
124a0 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f  ere.    ** witho
124b0 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  ut clearing the 
124c0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73  error code. This
124d0 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20   is intentional 
124e0 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  - the error.    
124f0 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72  ** code is clear
12500 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
12510 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c   reset in the bl
12520 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ock below..    *
12530 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
12540 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
12550 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
12560 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
12570 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12580 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12590 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
125a0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
125b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50  ;.  }..  /* If P
125c0 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
125d0 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
125e0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
125f0 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
12600 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
12610 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
12620 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
12630 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
12640 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20   pager,.  ** it 
12650 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20  can safely move 
12660 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50  back to PAGER_OP
12670 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68  EN state. This h
12680 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20  appens in both. 
12690 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65   ** normal and e
126a0 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
126b0 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   mode..  */.  if
126c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
126d0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
126e0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
126f0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
12700 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
12710 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12720 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
12730 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  le;.    pPager->
12740 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
12750 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  PEN;.    pPager-
12760 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
12770 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 55 53  E_OK;.    if( US
12780 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
12790 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
127a0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
127b0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67   0);.  }..  pPag
127c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
127d0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
127e0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
127f0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12800 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
12810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12820 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
12830 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
12840 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
12850 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12860 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
12870 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
12880 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
12890 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
128a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
128b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
128c0 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
128d0 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
128e0 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
128f0 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12900 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
12910 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
12920 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
12930 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
12940 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
12950 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12960 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
12970 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12980 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
12990 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
129a0 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
129b0 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
129c0 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
129d0 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
129e0 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
129f0 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12a00 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
12a10 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
12a20 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
12a30 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12a40 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
12a50 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12a60 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
12a70 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
12a80 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
12a90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
12aa0 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
12ab0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
12ac0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12ad0 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12ae0 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12af0 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
12b00 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
12b10 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
12b20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
12b30 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12b40 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
12b50 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12b60 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
12b70 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
12b80 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
12b90 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
12ba0 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
12bb0 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
12bc0 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12bd0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12be0 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12bf0 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
12c00 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
12c10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12c20 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
12c30 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
12c40 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
12c50 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12c60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12c70 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
12c80 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
12c90 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12ca0 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
12cb0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12cc0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12cd0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12ce0 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12cf0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
12d00 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
12d10 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
12d20 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
12d30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
12d40 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
12d50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12d60 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
12d70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12d80 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
12d90 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
12da0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12db0 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
12dc0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
12dd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
12de0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
12df0 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
12e00 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
12e10 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
12e20 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
12e30 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
12e40 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
12e50 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
12e60 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
12e70 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
12e80 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
12e90 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
12ea0 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
12eb0 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
12ec0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12ed0 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
12ee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
12ef0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12f00 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
12f10 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
12f20 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73   state. If it is
12f30 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41   called.** in PA
12f40 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45  GER_NONE or PAGE
12f50 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61  R_SHARED state a
12f60 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64  nd the lock held
12f70 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c   is less.** excl
12f80 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53  usive than a RES
12f90 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69  ERVED lock, it i
12fa0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12fb0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
12fc0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
12fd0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
12fe0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
12ff0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
13000 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
13010 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
13020 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
13030 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
13040 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
13050 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
13060 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
13070 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
13080 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
13090 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
130a0 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
130b0 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
130c0 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
130d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
130e0 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
130f0 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
13100 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
13110 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
13120 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
13130 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
13140 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
13150 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
13160 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
13170 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
13180 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
13190 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
131a0 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
131b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
131c0 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
131d0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
131e0 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
131f0 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
13200 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
13210 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
13220 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
13230 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
13240 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
13250 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
13260 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13270 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
13280 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
13290 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
132a0 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
132b0 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
132c0 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
132d0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
132e0 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
132f0 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
13300 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
13310 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
13320 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
13330 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
13340 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
13350 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
13360 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
13370 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
13380 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13390 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
133a0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
133b0 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
133c0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
133d0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
133e0 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
133f0 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
13400 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
13410 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
13420 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
13430 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
13440 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
13450 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
13460 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13470 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
13480 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
13490 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
134a0 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
134b0 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
134c0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
134d0 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
134e0 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   the pager moves
134f0 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
13500 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75   state..** If ru
13510 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
13520 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20  lusive rollback 
13530 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f  mode, the lock o
13540 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a  n the file is .*
13550 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
13560 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  a SHARED_LOCK..*
13570 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
13580 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
13590 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
135a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
135b0 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
135c0 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
135d0 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
135e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
135f0 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
13600 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
13610 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
13620 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
13630 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
13640 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
13650 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13660 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
13670 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
13680 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
13690 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
136a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
136b0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
136c0 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
136d0 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
136e0 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
136f0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13700 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
13710 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
13720 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
13730 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
13740 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13750 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
13760 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
13770 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
13780 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
13790 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
137a0 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  aster, int bComm
137b0 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  it){.  int rc = 
137c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
137d0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
137e0 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
137f0 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
13800 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
13810 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13820 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13830 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
13840 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
13850 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13860 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
13870 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
13880 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
13890 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
138a0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
138b0 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
138c0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
138d0 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
138e0 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
138f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
13900 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
13910 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13920 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
13930 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
13940 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
13950 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13960 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
13970 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
13980 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
13990 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
139a0 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
139b0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
139c0 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
139d0 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
139e0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
139f0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
13a00 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
13a10 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
13a20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
13a30 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
13a40 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
13a50 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13a60 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
13a70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
13a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13a90 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
13aa0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
13ab0 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
13ac0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13ad0 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
13ae0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
13af0 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
13b00 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13b10 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13b20 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13b30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13b40 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13b50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13b60 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
13b70 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
13b80 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
13b90 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13bb0 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
13bc0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
13bd0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
13be0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13bf0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
13c00 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13c10 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13c20 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13c30 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13c40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13c50 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13c60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13c70 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
13c80 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
13c90 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
13ca0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13cb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13cc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13cd0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
13ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13cf0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13d00 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
13d10 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13d20 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13d30 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13d40 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
13d50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13d60 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
13d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13d80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13d90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13da0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
13db0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
13dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
13dd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13de0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
13df0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13e00 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13e10 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13e20 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13e30 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13e40 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13e50 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13e60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
13e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
13e80 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
13e90 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
13ea0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
13eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13ec0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13ed0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
13ee0 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
13ef0 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
13f00 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13f10 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13f20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13f30 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13f40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13f50 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13f60 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
13f70 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
13f80 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
13f90 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
13fa0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
13fb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13fc0 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13fd0 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13fe0 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13ff0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
14000 65 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72  elete = (!pPager
14010 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71  ->tempFile && sq
14020 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73  lite3JournalExis
14030 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29  ts(pPager->jfd))
14040 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14050 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14060 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14070 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
14080 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14090 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
140a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
140b0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
140c0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
140d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
140e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
140f0 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
14100 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
14110 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
14120 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
14130 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
14140 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
14150 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
14160 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
14170 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
14180 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
14190 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
141a0 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
141b0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
141c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
141d0 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
141e0 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
141f0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
14200 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
14210 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
14220 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
14230 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
14240 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
14250 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
14260 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
14270 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
14280 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14290 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
142a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
142b0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
142c0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
142d0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
142e0 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
142f0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
14300 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
14310 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
14320 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
14330 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74  PCache);.  sqlit
14340 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
14350 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14360 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14370 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
14380 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
14390 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
143a0 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c   WAL write-lock,
143b0 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69   if any. Also, i
143c0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
143d0 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20   was in .    ** 
143e0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
143f0 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20  lusive mode but 
14400 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72  is no longer, dr
14410 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
14420 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65   .    ** lock he
14430 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
14440 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
14450 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14460 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
14470 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
14480 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
14490 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
144a0 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  K );.  }else if(
144b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
144c0 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61  & bCommit && pPa
144d0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
144e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
144f0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  {.    /* This br
14500 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
14510 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
14520 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72  transaction in r
14530 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a  ollback-journal.
14540 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74      ** mode if t
14550 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14560 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67   on disk is larg
14570 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
14580 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
14590 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  ** At this point
145a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
145b0 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
145c0 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
145d0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63  ion .    ** succ
145e0 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74  essfully committ
145f0 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c  ed, but the EXCL
14600 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74  USIVE lock is st
14610 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  ill held on the.
14620 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
14630 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72  it is safe to tr
14640 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
14650 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20  ase file to its 
14660 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72  minimum.    ** r
14670 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a  equired size.  *
14680 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
14690 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
146a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
146b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
146c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
146d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
146e0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
146f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
14700 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50  mit && isOpen(pP
14710 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
14720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
14730 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
14740 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
14750 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45  NTL_COMMIT_PHASE
14760 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  TWO, 0);.    if(
14770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
14780 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49  OUND ) rc = SQLI
14790 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
147a0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
147b0 73 69 76 65 4d 6f 64 65 20 26 26 20 21 70 50 61  siveMode && !pPa
147c0 67 65 72 2d 3e 6f 74 61 4d 6f 64 65 0a 20 20 20  ger->otaMode.   
147d0 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
147e0 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
147f0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
14800 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
14810 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
14820 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
14830 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
14840 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
14850 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14860 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
14870 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
14880 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
14890 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
148a0 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
148b0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
148c0 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
148d0 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
148e0 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
148f0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14900 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
14910 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
14920 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
14930 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
14940 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14950 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
14960 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
14970 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
14980 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
14990 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
149a0 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
149b0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
149c0 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
149d0 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
149e0 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
149f0 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14a00 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14a10 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14a20 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14a30 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14a40 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14a50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
14a60 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
14a70 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
14a80 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
14a90 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
14aa0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
14ab0 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14ac0 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14ad0 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14ae0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14af0 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14b00 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14b10 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14b20 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14b30 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14b40 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14b50 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
14b60 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
14b70 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
14b80 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
14b90 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
14ba0 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
14bb0 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14bc0 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14bd0 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14be0 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14bf0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14c00 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14c10 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14c20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14c30 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14c40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14c50 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
14c60 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
14c70 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14c80 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
14c90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
14ca0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
14cb0 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
14cc0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
14cd0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
14ce0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
14cf0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14d00 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
14d10 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14d20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
14d30 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14d40 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
14d50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
14d60 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
14d70 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
14d80 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
14d90 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
14da0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
14db0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
14dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
14dd0 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
14de0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14df0 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
14e00 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
14e10 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
14e20 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
14e30 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
14e40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
14e50 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
14e60 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
14e70 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
14e80 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
14e90 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
14ea0 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
14eb0 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
14ec0 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
14ed0 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
14ee0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
14ef0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
14f00 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
14f10 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
14f20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
14f30 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
14f40 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
14f50 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
14f60 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
14f70 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
14f80 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
14f90 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
14fa0 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
14fb0 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
14fc0 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
14fd0 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
14fe0 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
14ff0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15000 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15010 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15020 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15030 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
15040 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
15050 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
15060 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
15070 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
15080 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
15090 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
150a0 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
150b0 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
150c0 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
150d0 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
150e0 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
150f0 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
15100 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
15110 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
15120 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
15130 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
15140 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
15150 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
15160 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
15170 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
15180 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
15190 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
151a0 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
151b0 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
151c0 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
151d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
151e0 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
151f0 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
15200 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
15210 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
15220 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15230 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
15240 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
15250 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
15260 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
15270 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
15280 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
15290 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
152a0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
152b0 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
152c0 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
152d0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
152e0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
152f0 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
15300 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
15310 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
15320 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15330 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
15340 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
15350 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
15360 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
15370 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15390 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
153a0 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
153b0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
153c0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
153d0 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
153e0 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
153f0 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
15400 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
15410 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
15420 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
15430 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
15440 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
15450 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
15460 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
15470 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
15480 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
15490 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
154a0 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
154b0 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
154c0 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
154d0 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
154e0 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
154f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
15500 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
15510 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
15520 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
15530 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
15540 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
15550 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
15560 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
15570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15580 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
15590 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
155a0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
155b0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
155c0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
155d0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
155e0 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
155f0 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
15600 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
15610 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
15620 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
15630 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
15640 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
15650 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
15660 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
15670 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
15680 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
15690 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
156a0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
156b0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
156c0 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
156d0 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
156e0 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
156f0 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
15700 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
15710 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
15720 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
15730 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
15740 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
15750 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
15760 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15770 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
15780 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
15790 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
157a0 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
157b0 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
157c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
157d0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
157e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
157f0 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
15800 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
15810 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15820 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
15830 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
15840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
15850 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
15860 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15870 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
15880 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
15890 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
158a0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
158b0 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
158c0 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
158d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
158e0 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
158f0 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
15900 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
15910 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
15920 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
15930 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
15940 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
15950 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
15960 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
15970 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
15980 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
15990 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
159a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
159b0 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
159c0 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
159d0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
159e0 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
159f0 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
15a00 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
15a10 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
15a20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
15a30 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
15a40 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
15a50 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15a60 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
15a70 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
15a80 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
15a90 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
15aa0 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
15ab0 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
15ac0 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
15ad0 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
15ae0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
15af0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
15b00 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
15b10 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
15b20 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
15b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15b40 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
15b50 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15b60 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15b80 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
15b90 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
15ba0 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bc0 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
15bd0 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
15be0 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
15bf0 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
15c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
15c10 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
15c20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
15c30 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
15c40 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
15c50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
15c60 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15c70 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
15c80 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
15c90 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
15ca0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
15cb0 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
15cc0 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
15cd0 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
15ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15cf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15d00 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
15d10 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
15d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15d30 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
15d40 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
15d50 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
15d60 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d80 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
15d90 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
15da0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
15db0 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
15dc0 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
15dd0 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
15de0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
15df0 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
15e20 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
15e30 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
15e40 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29   (isMainJrnl&~1)
15e50 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69  ==0 );      /* i
15e60 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f  sMainJrnl is 0 o
15e70 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
15e80 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d   (isSavepnt&~1)=
15e90 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69  =0 );       /* i
15ea0 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72  sSavepnt is 0 or
15eb0 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
15ec0 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44  isMainJrnl || pD
15ed0 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44  one );     /* pD
15ee0 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20  one always used 
15ef0 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  on sub-journals 
15f00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  */.  assert( isS
15f10 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d  avepnt || pDone=
15f20 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65  =0 );   /* pDone
15f30 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e   never used on n
15f40 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  on-savepoint */.
15f50 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65  .  aData = pPage
15f60 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
15f70 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
15f80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
15f90 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
15fa0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
15fb0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61  allocated */.  a
15fc0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
15fd0 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
15fe0 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26   (!isMainJrnl &&
15ff0 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a   isSavepnt) );..
16000 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
16010 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72  state is greater
16020 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54   than PAGER_WRIT
16030 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74  ER_CACHEMOD (a t
16040 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
16050 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f   or savepoint ro
16060 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74  llback done at t
16070 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68  he request of th
16080 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69  e caller) or thi
16090 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  s is.  ** a hot-
160a0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
160b0 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74  . If it is a hot
160c0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
160d0 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  k, the pager.  *
160e0 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50  * is in state OP
160f0 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20  EN and holds an 
16100 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
16110 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  Hot-journal roll
16120 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72  back.  ** only r
16130 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  eads from the ma
16140 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20  in journal, not 
16150 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
16160 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16170 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16180 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16190 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
161a0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
161b0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
161c0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
161d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
161e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
161f0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
16200 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16210 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c  OD || isMainJrnl
16220 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
16230 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
16240 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
16250 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
16260 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
16270 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
16280 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
16290 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
162a0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
162b0 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
162c0 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
162d0 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
162e0 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
162f0 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
16300 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
16310 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16320 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16330 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16340 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
16350 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16360 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
16370 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
16380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16390 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
163a0 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
163b0 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
163c0 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
163d0 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
163e0 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
163f0 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
16400 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
16410 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
16420 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
16430 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
16440 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
16450 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
16460 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
16470 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
16480 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
16490 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
164a0 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
164b0 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
164c0 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
164d0 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
164e0 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
164f0 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
16500 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
16510 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
16520 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
16530 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
16540 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
16550 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16560 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
16570 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
16580 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
16590 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
165a0 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
165b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
165c0 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
165d0 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
165e0 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
165f0 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
16600 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
16610 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
16620 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
16630 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
16640 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
16650 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
16660 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16670 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
16680 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
16690 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
166a0 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79  y been played by
166b0 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
166c0 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
166d0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
166e0 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
166f0 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
16700 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
16710 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
16720 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
16730 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
16740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16750 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
16760 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
16770 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
16780 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
16790 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
167a0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
167b0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
167c0 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
167d0 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
167e0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
167f0 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
16800 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
16810 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
16820 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
16830 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
16840 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
16850 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
16860 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
16870 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
16880 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
16890 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
168a0 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
168b0 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
168c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
168d0 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
168e0 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
168f0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
16900 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
16910 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
16920 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
16930 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
16940 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
16950 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
16960 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
16970 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
16980 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
16990 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
169a0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
169b0 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
169c0 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
169d0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
169e0 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
169f0 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
16a00 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
16a10 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
16a20 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
16a30 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
16a40 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
16a50 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
16a60 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
16a70 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
16a80 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
16a90 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
16aa0 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
16ab0 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
16ac0 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
16ad0 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
16ae0 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
16af0 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
16b00 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
16b10 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
16b20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
16b30 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
16b40 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
16b50 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
16b60 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16b70 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
16b80 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
16b90 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
16ba0 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
16bb0 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
16bc0 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
16bd0 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
16be0 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
16bf0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
16c00 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
16c10 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
16c20 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
16c30 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
16c40 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16c50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
16c60 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
16c70 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
16c80 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
16c90 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
16ca0 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
16cb0 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
16cc0 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
16cd0 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
16ce0 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
16cf0 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
16d00 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
16d10 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
16d20 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
16d30 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
16d40 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
16d50 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
16d60 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
16d70 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
16d80 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
16d90 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
16da0 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
16db0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
16dc0 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
16dd0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
16de0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
16df0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
16e00 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
16e10 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
16e20 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
16e30 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
16e40 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
16e50 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
16e60 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
16e70 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
16e80 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
16e90 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
16ea0 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
16eb0 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
16ec0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
16ed0 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
16ee0 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
16ef0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
16f00 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
16f10 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
16f20 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
16f30 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
16f40 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
16f50 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
16f60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
16f70 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
16f80 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
16f90 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
16fa0 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
16fb0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
16fc0 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
16fd0 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
16fe0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
16ff0 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
17000 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
17010 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
17020 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
17030 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
17040 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
17050 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
17060 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
17070 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
17080 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
17090 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
170a0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
170b0 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
170c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
170d0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
170e0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
170f0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
17100 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
17110 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
17120 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
17130 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
17140 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
17150 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
17160 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
17170 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
17180 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
17190 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
171a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
171b0 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
171c0 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
171d0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
171e0 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
171f0 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
17200 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
17210 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
17220 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
17230 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
17240 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
17250 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
17260 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
17270 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
17280 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
17290 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
172a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
172b0 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
172c0 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
172d0 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
172e0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
172f0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
17300 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
17310 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
17320 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
17330 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
17340 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17350 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
17360 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
17370 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
17380 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20  pPager->fd, (u8 
17390 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
173a0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29  >pageSize, ofst)
173b0 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ;.    if( pgno>p
173c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
173d0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
173e0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
173f0 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
17400 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
17410 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  kup ){.      COD
17420 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
17430 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
17440 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
17450 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
17460 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
17470 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
17480 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20  u8*)aData);.    
17490 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
174a0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c   aData, pgno, 7,
174b0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
174c0 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  , aData);.    }.
174d0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
174e0 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
174f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
17500 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
17510 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
17520 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
17530 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
17540 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
17550 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
17560 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
17570 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
17580 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
17590 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
175a0 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
175b0 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
175c0 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
175d0 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
175e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
175f0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
17600 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
17610 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
17620 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
17630 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
17640 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
17650 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
17660 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
17670 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
17680 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
17690 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
176a0 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
176b0 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
176c0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
176d0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
176e0 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
176f0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
17700 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
17710 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
17720 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
17730 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
17740 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
17750 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
17760 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
17770 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
17780 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
17790 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
177a0 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
177b0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
177c0 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
177d0 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
177e0 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
177f0 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
17800 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
17810 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17820 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
17830 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
17840 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
17850 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
17860 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
17870 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
17880 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
17890 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
178a0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
178b0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
178c0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
178d0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
178e0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
178f0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
17900 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
17910 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
17920 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
17930 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
17940 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30  LAG_ROLLBACK)!=0
17950 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17960 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
17970 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
17980 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  K;.    if( rc!=S
17990 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
179a0 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66  n rc;.    pPg->f
179b0 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
179c0 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
179d0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
179e0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
179f0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
17a00 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
17a10 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
17a20 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
17a30 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
17a40 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
17a50 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
17a60 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
17a70 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
17a80 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
17a90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
17aa0 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
17ab0 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
17ac0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
17ad0 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
17ae0 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
17af0 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
17b00 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
17b10 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
17b20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
17b30 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
17b40 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
17b50 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
17b60 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
17b70 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
17b80 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17b90 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
17ba0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
17bb0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d  Pg);.    if( isM
17bc0 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53  ainJrnl && (!isS
17bd0 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73  avepnt || *pOffs
17be0 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  et<=pPager->jour
17bf0 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20  nalHdr) ){.     
17c00 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
17c10 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
17c20 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f   were just resto
17c30 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  red from the mai
17c40 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  n .      ** jour
17c50 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
17c60 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ts content must 
17c70 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20  be as they were 
17c80 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  when the .      
17c90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
17ca0 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
17cb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
17cc0 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61   can mark the pa
17cd0 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63  ge.      ** as c
17ce0 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72  lean, since ther
17cf0 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65  e will be no nee
17d00 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75  d to write it ou
17d10 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
17d20 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
17d30 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
17d40 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
17d50 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
17d60 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
17d70 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
17d80 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
17d90 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
17da0 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
17db0 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
17dc0 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
17dd0 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
17de0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
17df0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
17e00 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
17e10 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
17e20 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
17e30 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
17e40 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
17e50 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
17e60 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
17e70 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17e80 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
17e90 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
17ea0 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
17eb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
17ec0 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
17ed0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
17ee0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
17ef0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
17f00 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
17f10 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
17f20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
17f30 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
17f40 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
17f50 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
17f60 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
17f70 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
17f80 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17f90 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
17fa0 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
17fb0 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
17fc0 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
17fd0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
17fe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
17ff0 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
18000 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
18010 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
18020 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
18030 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
18040 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
18050 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
18060 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
18070 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
18080 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
18090 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
180a0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
180b0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
180c0 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
180d0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
180e0 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
180f0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
18100 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
18110 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
18120 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
18130 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
18140 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
18150 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
18160 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
18170 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
18180 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
18190 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
181a0 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
181b0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
181c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
181d0 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
181e0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
181f0 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
18200 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
18210 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
18220 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
18230 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
18240 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
18250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18260 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
18270 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
18280 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
18290 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
182a0 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
182b0 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
182c0 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
182d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
182e0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
182f0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
18300 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
18310 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
18320 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
18330 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18340 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
18350 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
18360 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
18370 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
18380 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
18390 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
183a0 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
183b0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
183c0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
183d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
183e0 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
183f0 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
18400 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
18410 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
18420 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
18430 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
18440 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
18450 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
18460 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
18470 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
18480 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
18490 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
184a0 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
184b0 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
184c0 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
184d0 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
184e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
184f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
18500 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
18510 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
18520 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
18530 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
18540 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
18550 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
18560 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
18570 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
18580 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
18590 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
185a0 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
185b0 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
185c0 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
185d0 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
185e0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
185f0 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
18600 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18610 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
18620 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
18630 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
18640 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
18650 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18660 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
18670 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
18680 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
18690 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
186a0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
186b0 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
186c0 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
186d0 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
186e0 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
186f0 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
18700 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
18710 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
18720 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
18730 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
18740 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
18750 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
18760 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
18770 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
18780 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
18790 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
187a0 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
187b0 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
187c0 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
187d0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
187e0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
187f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
18800 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
18810 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
18820 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
18830 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
18840 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
18850 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
18860 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
18870 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
18880 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
18890 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
188a0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
188b0 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
188c0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
188d0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
188e0 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
188f0 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
18900 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
18910 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
18920 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
18930 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
18940 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
18950 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
18960 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
18970 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
18980 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18990 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
189a0 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
189b0 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
189c0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
189d0 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
189e0 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
189f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
18a00 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
18a10 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
18a20 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
18a30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18a40 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
18a50 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a70 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18a80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18a90 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
18aa0 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
18ab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
18ac0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
18ad0 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
18ae0 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
18af0 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
18b00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18b10 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18b20 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
18b30 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
18b40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18b50 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
18b60 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
18b70 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
18b80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18b90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
18ba0 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
18bb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
18bc0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
18bd0 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
18be0 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
18bf0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
18c00 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
18c10 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
18c20 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
18c30 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
18c40 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
18c50 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
18c60 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
18c70 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
18c80 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
18c90 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
18ca0 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
18cb0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
18cc0 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
18cd0 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
18ce0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18cf0 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
18d00 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
18d10 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
18d20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
18d30 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
18d40 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
18d50 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
18d60 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
18d70 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
18d80 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
18d90 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
18da0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
18dc0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
18dd0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
18de0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
18df0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
18e00 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18e10 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
18e20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
18e30 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
18e40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18e50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
18e60 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
18e70 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
18e80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18e90 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
18ea0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
18eb0 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
18ec0 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
18ed0 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
18ee0 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
18ef0 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
18f00 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
18f10 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
18f20 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
18f30 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
18f40 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
18f50 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
18f60 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
18f70 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
18f80 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
18f90 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
18fa0 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
18fb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18fc0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
18fd0 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
18fe0 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
18ff0 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
19000 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
19010 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
19020 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
19030 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
19040 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
19050 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
19060 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
19070 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19080 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ut;.  }.  zMaste
19090 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
190a0 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
190b0 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d  urnal+1];.  rc =
190c0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
190d0 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
190e0 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
190f0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
19100 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19110 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19120 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61  aster_out;.  zMa
19130 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
19140 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b  terJournal] = 0;
19150 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a  ..  zJournal = z
19160 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
19170 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
19180 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
19190 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
191a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73   ){.    int exis
191b0 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ts;.    rc = sql
191c0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
191d0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
191e0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
191f0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
19200 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19210 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
19220 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
19240 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
19250 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
19260 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
19270 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
19280 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
19290 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
192a0 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
192b0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
192c0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
192d0 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
192e0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
192f0 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
19300 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
19310 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
19320 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   c;.      int fl
19330 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
19340 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
19350 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
19360 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
19370 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19380 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
19390 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
193a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
193b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
193c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
193d0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
193e0 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
193f0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
19400 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
19410 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
19420 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
19430 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
19440 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
19450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19460 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19470 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19480 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
19490 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
194a0 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
194b0 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
194c0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
194d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
194e0 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
194f0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
19500 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19510 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
19520 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19530 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
19540 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
19550 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
19560 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
19570 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
19580 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19590 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
195a0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
195b0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
195c0 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
195d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
195e0 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
195f0 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
19600 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19610 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
19620 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
19630 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
19640 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
19650 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
19660 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
19670 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19680 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
19690 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
196a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
196b0 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
196c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
196d0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
196e0 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
196f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
19700 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
19710 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
19720 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
19730 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
19740 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
19750 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19760 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
19770 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
19780 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
19790 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
197a0 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
197b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
197c0 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
197d0 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
197e0 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
197f0 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
19800 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
19810 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
19820 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
19830 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
19840 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
19850 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
19860 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
19870 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
19880 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
19890 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
198a0 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
198b0 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
198c0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
198d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
198e0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
198f0 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
19900 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
19910 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
19920 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
19930 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
19940 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
19950 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
19960 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
19970 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
19980 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
19990 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
199a0 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
199b0 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
199c0 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
199d0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
199e0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
199f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
19a00 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
19a10 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
19a20 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
19a30 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
19a40 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
19a50 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
19a60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19a70 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
19a80 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
19a90 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
19aa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
19ab0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19ac0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
19ad0 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
19ae0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
19af0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
19b00 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28    .  if( isOpen(
19b10 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
19b20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
19b30 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
19b40 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
19b50 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
19b60 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20  OPEN) .  ){.    
19b70 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
19b80 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e   newSize;.    in
19b90 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
19ba0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
19bb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19bc0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
19bd0 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a  E_LOCK );.    /*
19be0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
19bf0 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
19c00 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
19c10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
19c20 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
19c30 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
19c40 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
19c50 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69  Size = szPage*(i
19c60 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
19c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19c80 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d  && currentSize!=
19c90 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19ca0 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65   if( currentSize
19cb0 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  >newSize ){.    
19cc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19cd0 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
19ce0 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b  r->fd, newSize);
19cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
19d00 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a   (currentSize+sz
19d10 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29  Page)<=newSize )
19d20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
19d30 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70  pTmp = pPager->p
19d40 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
19d50 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30    memset(pTmp, 0
19d60 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  , szPage);.     
19d70 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
19d80 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d  wSize-szPage) ==
19d90 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
19da0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
19db0 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
19dc0 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a  e) >  currentSiz
19dd0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e );.        rc 
19de0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
19df0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d  (pPager->fd, pTm
19e00 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69  p, szPage, newSi
19e10 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  ze-szPage);.    
19e20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
19e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19e40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
19e50 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
19e60 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
19e70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19e90 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65  n a sanitized ve
19ea0 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63  rsion of the sec
19eb0 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66  tor-size of OS f
19ec0 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a  ile pFile. The.*
19ed0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
19ee0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
19ef0 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61  lie between 32 a
19f00 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  nd MAX_SECTOR_SI
19f10 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ZE..*/.int sqlit
19f20 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  e3SectorSize(sql
19f30 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
19f40 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20  ){.  int iRet = 
19f50 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
19f60 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ize(pFile);.  if
19f70 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20  ( iRet<32 ){.   
19f80 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d   iRet = 512;.  }
19f90 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41  else if( iRet>MA
19fa0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
19fb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
19fc0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
19fd0 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 );.    iRet = 
19fe0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
19ff0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1a000 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  et;.}../*.** Set
1a010 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1a020 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1a030 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20  ze variable for 
1a040 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67  the given.** pag
1a050 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
1a060 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1a070 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1a080 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
1a090 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1a0a0 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f   file. The secto
1a0b0 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75  r size will be u
1a0c0 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72  sed .** to deter
1a0d0 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e  mine the size an
1a0e0 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a  d alignment of j
1a0f0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e  ournal header an
1a100 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  d .** master jou
1a110 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69  rnal pointers wi
1a120 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75  thin created jou
1a130 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
1a140 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
1a150 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74  files the effect
1a160 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a170 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  is always 512 by
1a180 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  tes..**.** Other
1a190 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65  wise, for non-te
1a1a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74  mporary files, t
1a1b0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a1c0 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74  tor size is.** t
1a1d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1a1e0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
1a1f0 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f  Size() method ro
1a200 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69  unded up to 32 i
1a210 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
1a220 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e  than 32, or roun
1a230 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f  ded down to MAX_
1a240 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69  SECTOR_SIZE if i
1a250 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
1a260 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  than MAX_SECTOR_
1a270 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  SIZE..**.** If t
1a280 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20  he file has the 
1a290 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1a2a0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a2b0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
1a2c0 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63  set.** the effec
1a2d0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a2e0 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20   to its minimum 
1a2f0 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68  value (512).  Th
1a300 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20  e purpose of.** 
1a310 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a320 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20  ze is to define 
1a330 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75  the "blast radiu
1a340 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  s" of bytes that
1a350 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1a360 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   if a crash occu
1a370 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  rs while writing
1a380 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74   to a single byt
1a390 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e  e in.** that ran
1a3a0 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f  ge.  But with PO
1a3b0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a3c0 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64  E, the blast rad
1a3d0 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28  ius is zero.** (
1a3e0 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57  that is what POW
1a3f0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a400 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d   means), so we m
1a410 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74  inimize the sect
1a420 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72  or.** size.  For
1a430 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
1a440 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  tibility of the 
1a450 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a460 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a   file format,.**
1a470 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63   we cannot reduc
1a480 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1a490 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f  sector size belo
1a4a0 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  w 512..*/.static
1a4b0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
1a4c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
1a4d0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
1a4e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1a4f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1a500 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  File );..  if( p
1a510 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
1a520 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
1a530 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a540 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1a550 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) & .           
1a560 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1a570 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1a580 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ITE)!=0.  ){.   
1a590 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
1a5a0 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
1a5b0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1a5c0 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
1a5d0 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
1a5e0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1a5f0 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
1a600 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
1a610 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
1a620 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
1a630 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  lt. */.    pPage
1a640 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1a650 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  512;.  }else{.  
1a660 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
1a670 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65  Size = sqlite3Se
1a680 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
1a690 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  >fd);.  }.}../*.
1a6a0 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
1a6b0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
1a6c0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1a6d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
1a6e0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
1a6f0 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
1a700 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
1a710 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
1a720 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a730 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
1a740 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
1a750 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
1a760 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
1a770 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
1a780 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
1a790 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a7a0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1a7b0 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
1a7c0 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
1a7d0 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
1a7e0 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
1a7f0 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1a800 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
1a810 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
1a820 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
1a830 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
1a840 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
1a850 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1a860 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1a870 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
1a880 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
1a890 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
1a8a0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
1a8b0 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
1a8c0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a8d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1a8e0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
1a8f0 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
1a900 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
1a910 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
1a920 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1a930 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1a940 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
1a950 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
1a960 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
1a970 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
1a980 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
1a990 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a9a0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a9b0 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  s the page size.
1a9c0 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70  .**  (7)  zero p
1a9d0 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68  adding out to th
1a9e0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69  e next sector si
1a9f0 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72  ze..**  (8)  Zer
1aa00 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
1aa10 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
1aa20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
1aa30 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1aa40 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1aa50 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
1aa60 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
1aa70 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
1aa80 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
1aa90 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
1aaa0 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
1aab0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1aac0 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
1aad0 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76  rst 7 items abov
1aae0 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
1aaf0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1ab00 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
1ab10 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a  f the 8th item..
1ab20 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
1ab30 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
1ab40 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
1ab50 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
1ab60 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
1ab70 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
1ab80 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1ab90 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
1aba0 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
1abb0 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
1abc0 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
1abd0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1abe0 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
1abf0 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
1ac00 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
1ac10 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
1ac20 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
1ac30 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1ac40 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
1ac50 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1ac60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
1ac70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1ac80 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
1ac90 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
1aca0 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
1acb0 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
1acc0 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
1acd0 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
1ace0 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
1acf0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
1ad00 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
1ad10 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
1ad20 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
1ad30 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
1ad40 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
1ad50 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1ad60 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
1ad70 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1ad80 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
1ad90 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
1ada0 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
1adb0 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
1adc0 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
1add0 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
1ade0 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
1adf0 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
1ae00 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
1ae10 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
1ae20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
1ae30 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
1ae40 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
1ae50 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
1ae60 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
1ae70 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
1ae80 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
1ae90 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
1aea0 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
1aeb0 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
1aec0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
1aed0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
1aee0 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
1aef0 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
1af00 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
1af10 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
1af20 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
1af30 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
1af40 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
1af50 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
1af60 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
1af70 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
1af80 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
1af90 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
1afa0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1afb0 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
1afc0 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
1afd0 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
1afe0 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
1aff0 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
1b000 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
1b010 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
1b020 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
1b030 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
1b040 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1b050 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ned..**.** The i
1b060 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69  sHot parameter i
1b070 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
1b080 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1b090 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ollback a journa
1b0a0 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  l.** that might 
1b0b0 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  be a hot journal
1b0c0 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20  .  Or, it could 
1b0d0 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  be that the jour
1b0e0 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65  nal is .** prese
1b0f0 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rved because of 
1b100 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
1b110 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f  IST or JOURNALMO
1b120 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20  DE_TRUNCATE..** 
1b130 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  If the journal r
1b140 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65  eally is hot, re
1b150 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61  set the pager ca
1b160 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e  che prior rollin
1b170 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f  g.** back any co
1b180 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a  ntent.  If the j
1b190 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79  ournal is merely
1b1a0 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20   persistent, no 
1b1b0 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64  reset is.** need
1b1c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1b1d0 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
1b1e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1b1f0 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
1b200 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1b210 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
1b220 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
1b230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b240 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1b250 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
1b260 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b280 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
1b290 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
1b2a0 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2c0 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
1b2d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
1b2e0 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
1b2f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b300 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
1b310 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
1b320 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b340 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
1b350 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b360 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
1b370 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1b380 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1b390 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
1b3a0 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
1b3b0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
1b3c0 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
1b3d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
1b3e0 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  ny */.  int need
1b3f0 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20  PagerReset;     
1b400 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
1b410 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  t page prior to 
1b420 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62  first page rollb
1b430 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c  ack */.  int nPl
1b440 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20  ayback = 0;     
1b450 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1b460 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f  r of pages resto
1b470 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  red from journal
1b480 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1b490 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
1b4a0 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
1b4b0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
1b4c0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
1b4d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
1b4e0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
1b4f0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1b500 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
1b510 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1b520 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1b530 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
1b540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b550 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b560 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
1b570 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
1b580 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
1b590 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
1b5a0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
1b5b0 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
1b5c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1b5d0 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
1b5e0 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
1b5f0 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
1b600 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
1b610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b620 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
1b630 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
1b640 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
1b650 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1b660 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
1b670 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
1b680 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
1b690 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
1b6a0 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
1b6b0 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
1b6c0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
1b6d0 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
1b6e0 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
1b6f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1b700 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
1b710 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
1b720 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
1b730 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
1b740 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1b750 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1b760 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1b770 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1b780 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1b790 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1b7a0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1b7b0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1b7c0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1b7d0 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1b7e0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1b7f0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1b800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b810 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1b820 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1b830 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1b840 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1b850 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1b860 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1b870 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1b880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1b890 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1b8a0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b8b0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1b8c0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1b8d0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b8e0 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1b8f0 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1b900 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1b910 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1b920 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1b930 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1b940 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1b950 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1b960 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1b970 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1b980 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1b990 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1b9a0 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1b9b0 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1b9c0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1b9d0 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1b9e0 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1b9f0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1ba00 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1ba10 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1ba20 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1ba30 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1ba40 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1ba50 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1ba60 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1ba70 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1ba80 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1ba90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1baa0 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1bab0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1bac0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1bad0 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1bae0 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1baf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bb00 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1bb10 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1bb20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bb30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1bb40 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1bb50 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1bb60 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1bb70 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1bb80 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1bb90 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1bba0 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1bbb0 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1bbc0 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1bbd0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1bbe0 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1bbf0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1bc00 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1bc10 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1bc20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1bc30 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1bc40 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1bc50 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1bc60 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1bc70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bc80 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1bc90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1bca0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1bcb0 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1bcc0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1bcd0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1bce0 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1bcf0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bd00 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1bd10 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1bd20 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1bd30 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1bd40 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1bd50 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1bd60 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1bd70 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1bd80 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1bd90 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1bda0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1bdb0 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1bdc0 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1bdd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1bde0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1bdf0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1be00 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1be10 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1be20 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1be30 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1be40 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1be50 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1be60 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1be70 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1be80 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1be90 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1bea0 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1beb0 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1bec0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1bed0 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1bee0 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1bef0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1bf00 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1bf10 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1bf20 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1bf30 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1bf40 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1bf50 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1bf60 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1bf70 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1bf80 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1bf90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1bfa0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1bfb0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1bfc0 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1bfd0 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1bfe0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1bff0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1c000 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1c010 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1c020 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1c030 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1c040 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1c050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c060 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1c070 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1c080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1c090 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1c0a0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1c0b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1c0c0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1c0d0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1c0e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1c0f0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c100 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c110 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1c120 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1c130 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1c140 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1c150 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1c160 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1c170 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1c180 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1c190 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1c1a0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1c1b0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1c1c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1c1d0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1c1e0 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1c1f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c200 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1c210 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c230 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c240 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1c250 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1c260 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1c270 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1c280 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1c290 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1c2a0 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1c2b0 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1c2c0 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1c2d0 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1c2e0 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1c2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1c300 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1c310 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1c320 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1c330 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1c340 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1c350 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1c360 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c370 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1c380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  OK ){.        nP
1c3a0 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  layback++;.     
1c3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c3c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1c3d0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1c3e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c3f0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1c400 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c410 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1c420 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c430 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c440 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1c450 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1c460 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1c470 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1c480 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1c490 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1c4a0 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1c4b0 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1c4c0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1c4d0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1c4e0 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1c4f0 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1c500 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1c510 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1c520 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1c530 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1c540 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1c550 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1c560 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1c570 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1c580 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1c590 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1c5a0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1c5b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c5c0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1c5d0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c5e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c5f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1c600 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1c610 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1c620 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1c630 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1c640 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1c650 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1c660 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1c670 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1c680 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1c690 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1c6a0 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1c6b0 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1c6c0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1c6d0 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1c6e0 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1c6f0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1c700 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1c710 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1c720 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c730 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c740 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1c750 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1c760 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1c770 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1c780 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1c790 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1c7a0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1c7b0 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1c7c0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1c7d0 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1c7e0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1c7f0 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1c800 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1c810 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1c820 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1c830 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1c840 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1c850 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1c860 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c870 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1c880 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ied..  */.#ifdef
1c890 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c8a0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
1c8b0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1c8c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1c8d0 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
1c8e0 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1c8f0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1c900 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1c910 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1c920 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1c930 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1c940 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1c950 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1c960 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1c970 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1c980 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c990 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1c9a0 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1c9b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1c9c0 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1c9d0 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1c9e0 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1c9f0 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1ca00 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1ca10 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1ca20 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1ca30 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1ca40 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1ca50 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1ca60 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1ca70 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1ca80 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1ca90 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1caa0 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1cab0 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1cac0 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1cad0 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1cae0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1caf0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1cb00 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1cb10 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1cb20 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1cb30 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1cb40 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1cb50 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1cb60 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1cb70 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1cb80 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1cb90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cba0 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1cbb0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1cbc0 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1cbd0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1cbe0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1cbf0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1cc00 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1cc10 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1cc20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1cc30 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1cc40 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28  QLITE_OK.   && (
1cc50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1cc60 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1cc70 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1cc80 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1cc90 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
1cca0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1ccb0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
1ccc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ccd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1cce0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1ccf0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
1cd00 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c  Master[0]!='\0',
1cd10 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   0);.    testcas
1cd20 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1cd30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1cd40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1cd50 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
1cd60 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1cd70 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
1cd80 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
1cd90 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1cda0 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
1cdb0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1cdc0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
1cdd0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1cde0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
1cdf0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1ce00 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
1ce10 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1ce20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1ce30 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1ce40 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50   if( isHot && nP
1ce50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  layback ){.    s
1ce60 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
1ce70 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
1ce80 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f  _ROLLBACK, "reco
1ce90 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66  vered %d pages f
1cea0 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rom %s",.       
1ceb0 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61           nPlayba
1cec0 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ck, pPager->zJou
1ced0 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rnal);.  }..  /*
1cee0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1cef0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1cf00 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1cf10 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1cf20 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1cf30 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1cf40 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1cf50 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1cf60 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1cf70 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1cf80 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1cf90 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1cfa0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1cfb0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1cfc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cfd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1cfe0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1cff0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1d000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d010 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1d020 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1d030 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1d040 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1d050 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1d060 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1d070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d080 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1d090 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1d0a0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1d0b0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1d0c0 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1d0d0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1d0e0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1d0f0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1d100 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1d110 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1d120 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1d130 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1d140 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1d150 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1d160 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1d170 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1d180 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33  e(PgHdr *pPg, u3
1d190 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67  2 iFrame){.  Pag
1d1a0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1d1b0 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1d1c0 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1d1d0 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1d1e0 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1d1f0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1d200 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1d210 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1d220 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d230 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1d240 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1d250 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1d260 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1d270 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1d280 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1d290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d2a0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1d2b0 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1d2c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1d2d0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1d2e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1d2f0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28  E_OMIT_WAL.  if(
1d300 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f   iFrame ){.    /
1d310 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68  * Try to pull th
1d320 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1d330 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e  write-ahead log.
1d340 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1d350 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65  ite3WalReadFrame
1d360 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69  (pPager->pWal, i
1d370 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67  Frame, pgsz, pPg
1d380 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  ->pData);.  }els
1d390 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1d3a0 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1d3b0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1d3c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1d3d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d3e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1d3f0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1d400 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1d410 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d420 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1d430 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1d440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d450 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1d460 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1d470 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1d480 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1d490 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1d4a0 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1d4b0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1d4c0 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1d4d0 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1d4e0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1d4f0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1d500 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1d510 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1d520 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1d530 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1d540 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1d550 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1d560 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d570 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1d580 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1d590 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1d5a0 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1d5b0 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1d5c0 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1d5d0 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1d5e0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1d5f0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1d600 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1d610 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1d620 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1d630 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1d640 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1d650 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1d660 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1d670 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1d680 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1d690 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1d6a0 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1d6b0 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1d6c0 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1d6d0 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67  noising equaling
1d6e0 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1d6f0 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1d700 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1d710 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1d720 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1d730 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1d740 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d750 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1d760 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d770 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1d780 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1d790 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1d7a0 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1d7b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1d7c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d7d0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1d7e0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1d7f0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1d800 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1d810 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1d820 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  a, pgno, 3, rc =
1d830 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
1d840 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1d850 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1d860 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1d870 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1d880 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1d890 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1d8a0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1d8b0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1d8c0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1d8d0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1d8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d8f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d900 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1d910 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1d920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d930 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1d940 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1d950 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1d960 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1d970 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1d980 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1d990 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d9a0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1d9b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1d9c0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1d9d0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1d9e0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1d9f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1da00 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1da10 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1da20 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1da30 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1da40 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1da50 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1da60 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1da70 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1da80 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1da90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1daa0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1dab0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1dac0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1dad0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1dae0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1daf0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1db00 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1db10 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1db20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1db30 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1db40 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1db50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1db60 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1db70 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1db80 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1db90 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1dba0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1dbb0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1dbc0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1dbd0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1dbe0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1dbf0 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1dc00 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1dc10 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1dc20 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1dc30 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1dc40 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1dc50 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1dc60 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1dc70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1dc80 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1dc90 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1dca0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1dcb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dcc0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1dcd0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1dce0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1dcf0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1dd00 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1dd10 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1dd20 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1dd30 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1dd40 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1dd50 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1dd60 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1dd70 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1dd80 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1dd90 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1dda0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1ddb0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1ddc0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1ddd0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1dde0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1ddf0 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1de00 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1de10 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1de20 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1de30 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1de40 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1de50 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1de60 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1de70 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1de80 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1de90 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1dea0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1deb0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1dec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ded0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1dee0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1def0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1df00 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1df10 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1df20 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1df30 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1df40 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1df50 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1df60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1df70 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1df80 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1df90 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1dfa0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1dfb0 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1dfc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1dfd0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1dfe0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1dff0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1e000 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1e010 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1e020 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e030 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1e040 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1e050 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1e060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e070 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e080 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e090 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e0a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e0b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e0c0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e0d0 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
1e0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e0f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e100 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e110 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1e120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e130 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e140 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  fNotNull(pPg);. 
1e150 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1e160 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1e170 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e180 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1e190 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1e1a0 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1e1b0 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1e1c0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1e1d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1e1e0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1e1f0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1e200 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1e210 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1e220 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1e230 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1e240 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1e250 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1e260 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1e270 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1e280 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1e290 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1e2a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1e2b0 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1e2c0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1e2d0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1e2e0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1e2f0 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1e300 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1e310 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1e320 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1e330 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1e340 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1e350 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1e360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e370 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e380 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1e390 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1e3a0 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1e3b0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1e3c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1e3d0 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1e3e0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1e3f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e410 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1e420 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e440 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1e450 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1e460 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1e470 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1e480 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1e490 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1e4a0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1e4b0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1e4c0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1e4d0 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1e4e0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1e4f0 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1e500 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1e510 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1e520 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1e530 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1e540 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1e550 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1e560 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1e570 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1e580 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1e590 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1e5a0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1e5b0 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1e5c0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1e5d0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1e5e0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1e5f0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1e600 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1e610 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1e620 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1e630 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1e640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1e650 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1e660 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1e670 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1e680 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1e690 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1e6a0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1e6b0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1e6c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e6d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e6e0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1e6f0 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1e700 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1e710 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1e720 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1e730 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1e740 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1e750 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1e760 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1e770 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1e780 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1e790 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1e7a0 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1e7b0 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1e7c0 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1e7d0 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1e7e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e7f0 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1e800 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1e810 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1e820 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1e830 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1e840 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1e850 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1e860 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e870 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1e880 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e8a0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1e8b0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1e8e0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1e8f0 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1e920 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1e930 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1e940 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1e950 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e960 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1e970 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1e980 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e9a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e9b0 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20  int nList;      
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1e9e0 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23  es in pList */.#
1e9f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1ea00 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1ea10 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b  ned(SQLITE_CHECK
1ea20 5f 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20  _PAGES).  PgHdr 
1ea30 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1ea40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1ea50 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1ea60 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ges */.#endif.. 
1ea70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ea80 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  >pWal );.  asser
1ea90 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64  t( pList );.#ifd
1eaa0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1eab0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1eac0 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1ead0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1eae0 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1eaf0 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1eb00 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1eb10 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1eb20 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1eb30 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1eb40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1eb50 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  rt( pList->pDirt
1eb60 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74  y==0 || isCommit
1eb70 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d   );.  if( isComm
1eb80 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  it ){.    /* If 
1eb90 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1eba0 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  n is being commi
1ebb0 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e  tted, there is n
1ebc0 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69  o point in writi
1ebd0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61  ng.    ** any pa
1ebe0 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
1ebf0 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68  mbers greater th
1ec00 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74  an nTruncate int
1ec10 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a  o the WAL file..
1ec20 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c      ** They will
1ec30 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62   never be read b
1ec40 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f  y any client. So
1ec50 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
1ec60 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20  m the pDirty.   
1ec70 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a   ** list here. *
1ec80 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  /.    PgHdr *p;.
1ec90 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65      PgHdr **ppNe
1eca0 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20  xt = &pList;.   
1ecb0 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
1ecc0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70  for(p=pList; (*p
1ecd0 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70  pNext = p)!=0; p
1ece0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1ecf0 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d     if( p->pgno<=
1ed00 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  nTruncate ){.   
1ed10 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70       ppNext = &p
1ed20 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
1ed30 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20    nList++;.     
1ed40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1ed50 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20  ert( pList );.  
1ed60 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74  }else{.    nList
1ed70 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 1;.  }.  pPag
1ed80 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
1ed90 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e  STAT_WRITE] += n
1eda0 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69  List;..  if( pLi
1edb0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
1edc0 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1edd0 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
1ede0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1edf0 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e  lFrames(pPager->
1ee00 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61  pWal, .      pPa
1ee10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1ee20 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c  List, nTruncate,
1ee30 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65   isCommit, pPage
1ee40 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  r->walSyncFlags.
1ee50 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
1ee60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1ee70 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
1ee80 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1ee90 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1eea0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1eeb0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
1eec0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
1eed0 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e  >pBackup, p->pgn
1eee0 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74  o, (u8 *)p->pDat
1eef0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  a);.    }.  }..#
1ef00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1ef10 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74  CK_PAGES.  pList
1ef20 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1ef30 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1ef40 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f  ->pPCache);.  fo
1ef50 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1ef60 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1ef70 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
1ef80 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  sh(p);.  }.#endi
1ef90 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
1efa0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1efb0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1efc0 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a  n on the WAL..**
1efd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1efe0 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c   used to be call
1eff0 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61  ed "pagerOpenSna
1f000 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65  pshot()" because
1f010 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a   it essentially.
1f020 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73  ** makes a snaps
1f030 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  hot of the datab
1f040 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65  ase at the curre
1f050 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65  nt point in time
1f060 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a   and preserves.*
1f070 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20  * that snapshot 
1f080 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72  for use by the r
1f090 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f  eader in spite o
1f0a0 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63  f concurrently c
1f0b0 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68  hanges by.** oth
1f0c0 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68  er writers or ch
1f0d0 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  eckpointers..*/.
1f0e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f0f0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1f100 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
1f110 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f140 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   code */.  int c
1f150 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20  hanged = 0;     
1f160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f170 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74  ue if cache must
1f180 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20   be reset */..  
1f190 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
1f1a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
1f1b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f1c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1f1d0 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
1f1e0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
1f1f0 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  DER );..  /* sql
1f200 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1f210 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
1f220 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
1f230 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
1f240 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1f250 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
1f260 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
1f270 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
1f280 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
1f290 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
1f2a0 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
1f2b0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
1f2c0 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
1f2d0 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
1f2e0 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
1f2f0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1f300 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
1f310 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
1f320 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
1f330 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1f340 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1f350 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
1f360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f370 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   || changed ){. 
1f380 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1f390 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1f3a0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
1f3b0 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65   ) sqlite3OsUnfe
1f3c0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
1f3d0 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  0, 0);.  }..  re
1f3e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1f3f0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
1f400 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1f410 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
1f420 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20  transition from 
1f430 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f  PAGER_OPEN.** to
1f440 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
1f450 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ate to determine
1f460 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1f480 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75  * in pages (assu
1f490 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ming the page si
1f4a0 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ze currently sto
1f4b0 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67  red in Pager.pag
1f4c0 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  eSize)..**.** If
1f4d0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1f4e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1f4f0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
1f500 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1f510 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  base.** in pages
1f520 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
1f530 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  nPage. Otherwise
1f540 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1f550 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49  (perhaps.** SQLI
1f560 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20  TE_IOERR_FSTAT) 
1f570 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f580 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
1f590 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
1f5a0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
1f5b0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
1f5c0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e  pPager, Pgno *pn
1f5d0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
1f5e0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1f5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1f600 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
1f610 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
1f620 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73   Query the WAL s
1f630 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  ub-system for th
1f640 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e  e database size.
1f650 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29   The WalDbsize()
1f660 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  .  ** function r
1f670 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74  eturns zero if t
1f680 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70  he WAL is not op
1f690 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70  en (i.e. Pager.p
1f6a0 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  Wal==0), or.  **
1f6b0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f6c0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61   size is not ava
1f6d0 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61  ilable. The data
1f6e0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1f6f0 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
1f700 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
1f710 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c  -system if the l
1f720 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  og file is empty
1f730 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   or.  ** contain
1f740 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69  s no valid commi
1f750 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
1f760 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
1f770 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1f780 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
1f790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f7a0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
1f7b0 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20  LOCK );.  nPage 
1f7c0 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
1f7d0 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
1f7e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
1f7f0 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
1f800 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1f810 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1f820 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74  system,.  ** det
1f830 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20  ermine it based 
1f840 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  on the size of t
1f850 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f860 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20  . If the size.  
1f870 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
1f880 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  se file is not a
1f890 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
1f8a0 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
1f8b0 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20  ize,.  ** round 
1f8c0 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72  down to the near
1f8d0 65 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74  est page. Except
1f8e0 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65  , any file large
1f8f0 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79  r than 0.  ** by
1f900 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63  tes in size is c
1f910 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e  onsidered to con
1f920 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tain at least on
1f930 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  e page..  */.  i
1f940 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1f950 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66   /* Size of db f
1f980 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1f990 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1f9a0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1f9b0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1f9c0 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
1f9d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1f9e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1f9f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1fa00 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
1fa10 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20   &n);.      if( 
1fa20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fa30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fa40 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1fa50 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50  }.    nPage = (P
1fa60 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e  gno)((n+pPager->
1fa70 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50  pageSize-1) / pP
1fa80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1fa90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1faa0 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
1fab0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1fac0 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
1fad0 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63   than the.  ** c
1fae0 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
1faf0 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
1fb00 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
1fb10 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
1fb20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
1fb30 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
1fb40 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
1fb50 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
1fb60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
1fb70 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
1fb80 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67  e;.  }..  *pnPag
1fb90 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1fba0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fbb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fbc0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1fbd0 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77  Check if the *-w
1fbe0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72  al file that cor
1fbf0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
1fc00 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
1fc10 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69  by pPager.** exi
1fc20 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62  sts if the datab
1fc30 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c  ase is not empy,
1fc40 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20   or verify that 
1fc50 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64  the *-wal file d
1fc60 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74  oes.** not exist
1fc70 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74   (by deleting it
1fc80 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
1fc90 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e  e file is empty.
1fca0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
1fcb0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
1fcc0 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61  pty and the *-wa
1fcd0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f  l file exists, o
1fce0 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  pen the pager.**
1fcf0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49   in WAL mode.  I
1fd00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1fd10 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f  s empty or if no
1fd20 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1fd30 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20  ts and.** if no 
1fd40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61  error occurs, ma
1fd50 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f  ke sure Pager.jo
1fd60 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74  urnalMode is not
1fd70 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52   set to.** PAGER
1fd80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
1fd90 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1fda0 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65  QLITE_OK or an e
1fdb0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1fdc0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1fdd0 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c   hold a SHARED l
1fde0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1fdf0 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c  ase file to call
1fe00 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
1fe10 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58  n. Because an EX
1fe20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1fe30 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72  the db file is r
1fe40 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74  equired to delet
1fe50 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61  e .** a WAL on a
1fe60 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61   none-empty data
1fe70 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72  base, this ensur
1fe80 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  es there is no r
1fe90 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a  ace condition .*
1fea0 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41  * between the xA
1feb0 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e  ccess() below an
1fec0 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62  d an xDelete() b
1fed0 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79  eing executed by
1fee0 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20   some .** other 
1fef0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
1ff00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
1ff10 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
1ff20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ff30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ff40 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
1ff50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1ff60 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1ff70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ff80 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1ff90 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  CK );..  if( !pP
1ffa0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1ffb0 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
1ffe0 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
1fff0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  /.    Pgno nPage
20000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20010 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
20020 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20030 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   */..    rc = pa
20040 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
20050 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
20060 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20070 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50  n rc;.    if( nP
20080 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
20090 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
200a0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
200b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
200c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
200d0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
200e0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72  DELETE_NOENT ) r
200f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20100 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a       isWal = 0;.
20110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
20130 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
20140 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
20150 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
20160 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
20170 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20  S, &isWal.      
20180 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
201a0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
201b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l ){.        tes
201c0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
201d0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
201e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
201f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
20200 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
20210 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
20220 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20230 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
20240 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
20250 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
20260 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20270 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
20280 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20290 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
202a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
202b0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
202c0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
202d0 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
202e0 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
202f0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
20300 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
20310 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
20320 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
20330 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
20340 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
20350 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
20360 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
20370 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
20380 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
20390 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
203a0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
203b0 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
203c0 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
203d0 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
203e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
203f0 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
20400 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
20410 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
20420 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
20430 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
20440 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
20450 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
20460 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
20470 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
20480 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20490 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
204a0 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
204b0 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
204c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
204d0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
204e0 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
204f0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
20500 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
20510 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
20520 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
20530 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
20540 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20550 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
20560 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
20570 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20580 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
20590 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
205a0 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
205b0 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
205c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
205d0 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
205e0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
205f0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
20600 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
20610 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
20620 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
20630 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
20640 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
20650 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
20660 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
20670 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
20680 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
20690 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
206a0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
206b0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
206c0 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
206d0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
206e0 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
206f0 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
20700 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
20710 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
20720 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
20730 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
20740 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
20750 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
20760 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
20770 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
20780 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
20790 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
207a0 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
207b0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
207c0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
207d0 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
207e0 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
207f0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
20800 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
20810 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
20820 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
20830 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
20840 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
20850 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
20860 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
20870 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
20880 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
20890 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
208a0 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
208b0 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
208c0 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
208d0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
208e0 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
208f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
20900 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
20910 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
20920 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
20930 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
20940 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
20950 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
20960 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
20970 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
20980 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
20990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
209a0 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
209b0 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
209c0 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
209d0 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
209e0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a00 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
20a10 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20a20 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
20a30 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
20a40 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
20a50 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
20a60 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
20a70 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
20a80 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
20a90 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
20aa0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
20ab0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
20ac0 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
20ad0 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
20ae0 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
20af0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20b00 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
20b10 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
20b20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20b30 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
20b40 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
20b50 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
20b60 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
20b70 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
20b80 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
20b90 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
20ba0 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
20bb0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
20bc0 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
20bd0 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
20be0 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
20bf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20c00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
20c10 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
20c20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
20c30 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
20c40 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
20c50 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
20c60 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
20c70 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
20c80 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
20c90 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
20ca0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
20cb0 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
20cc0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67  OrigSize;.  pPag
20cd0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
20ce0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
20cf0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21  mpFile;..  if( !
20d00 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61  pSavepoint && pa
20d10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20d20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
20d30 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
20d40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
20d50 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
20d60 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
20d70 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
20d80 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
20d90 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
20da0 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
20db0 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
20dc0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
20dd0 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
20de0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
20df0 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
20e00 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
20e10 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
20e20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
20e30 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
20e40 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
20e50 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
20e60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
20e70 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
20e80 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
20e90 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a  0 || szJ==0 );..
20ea0 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
20eb0 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
20ec0 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
20ed0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
20ee0 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
20ef0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
20f00 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20f10 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
20f20 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
20f30 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
20f40 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
20f50 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
20f60 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
20f70 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
20f80 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
20f90 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
20fa0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
20fb0 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
20fc0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
20fd0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
20fe0 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
20ff0 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
21000 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
21010 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
21020 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ( pSavepoint && 
21030 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
21040 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72  ger) ){.    iHdr
21050 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
21060 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
21070 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
21080 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
21090 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
210a0 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
210b0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
210c0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
210d0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
210e0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
210f0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
21100 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21110 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21120 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
21130 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
21140 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
21150 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21160 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
21170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
21180 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
21190 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
211a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
211b0 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
211c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
211d0 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
211e0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
211f0 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
21200 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
21210 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
21220 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
21230 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
21240 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
21250 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
21260 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
21270 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
21280 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
21290 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
212a0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
212b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
212c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
212d0 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
212e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
212f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
21300 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
21310 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
21320 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
21330 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
21340 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
21350 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
21360 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
21370 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
21380 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21390 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
213a0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
213b0 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
213c0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
213d0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
213e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
213f0 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
21400 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
21410 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
21420 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
21430 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
21440 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
21450 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
21460 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
21470 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
21480 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
21490 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
214a0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
214b0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
214c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
214d0 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
214e0 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
214f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21500 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
21510 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
21520 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
21530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21540 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
21550 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21560 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
21570 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
21580 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
21590 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
215a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
215b0 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
215c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
215d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
215e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
215f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
21600 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21610 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f>=szJ );..  /* 
21620 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
21630 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
21640 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
21650 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
21660 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
21670 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
21680 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21690 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
216a0 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
216b0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
216c0 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
216d0 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
216e0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
216f0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
21700 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
21710 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21720 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
21730 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
21740 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  )pSavepoint->iSu
21750 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
21760 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
21770 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
21780 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
21790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
217a0 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50  SavepointUndo(pP
217b0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76  ager->pWal, pSav
217c0 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61  epoint->aWalData
217d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
217e0 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
217f0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
21800 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
21810 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
21820 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
21830 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29  t( offset==(i64)
21840 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
21850 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
21860 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
21870 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
21880 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
21890 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
218a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
218b0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
218c0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
218d0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
218e0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
218f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21900 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21910 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
21920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21930 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21940 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
21950 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
21960 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
21970 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
21980 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
21990 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
219a0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
219b0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
219c0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
219d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
219e0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
219f0 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46   Invoke SQLITE_F
21a00 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62  CNTL_MMAP_SIZE b
21a10 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
21a20 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d  ent value of szM
21a30 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  map..*/.static v
21a40 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c  oid pagerFixMapl
21a50 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
21a60 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  er){.#if SQLITE_
21a70 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
21a80 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
21a90 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
21aa0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64  .  if( isOpen(fd
21ab0 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64  ) && fd->pMethod
21ac0 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
21ad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
21ae0 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d  t64 sz;.    sz =
21af0 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b   pPager->szMmap;
21b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73  .    pPager->bUs
21b10 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b  eFetch = (sz>0);
21b20 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
21b30 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
21b40 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
21b50 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
21b60 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64  , &sz);.  }.#end
21b70 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  if.}../*.** Chan
21b80 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  ge the maximum s
21b90 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72  ize of any memor
21ba0 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f  y mapping made o
21bb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21bc0 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
21bd0 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
21be0 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  Limit(Pager *pPa
21bf0 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  ger, sqlite3_int
21c00 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50  64 szMmap){.  pP
21c10 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73  ager->szMmap = s
21c20 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69  zMmap;.  pagerFi
21c30 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
21c40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
21c50 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
21c60 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
21c70 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76   the pager..*/.v
21c80 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
21c90 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50  Shrink(Pager *pP
21ca0 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
21cb0 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61  PcacheShrink(pPa
21cc0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
21cd0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73  ../*.** Adjust s
21ce0 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70  ettings of the p
21cf0 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70  ager to those sp
21d00 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 70  ecified in the p
21d10 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  gFlags parameter
21d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76  ..**.** The "lev
21d30 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26  el" in pgFlags &
21d40 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
21d50 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65  US_MASK sets the
21d60 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f   robustness.** o
21d70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
21d80 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
21d90 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f  OS crashes or po
21da0 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a  wer failures by.
21db0 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ** changing the 
21dc0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
21dd0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  )s when writing 
21de0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  the journals..**
21df0 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
21e00 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
21e10 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
21e20 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
21e30 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
21e40 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
21e50 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
21e60 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
21e70 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
21e80 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
21e90 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
21ea0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
21eb0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
21ec0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
21ee0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
21ef0 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
21f00 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
21f10 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
21f20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
21f30 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
21f40 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
21f50 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
21f60 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
21f70 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
21f80 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
21f90 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
21fa0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21fb0 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
21fc0 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
21fd0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
21fe0 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
21ff0 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
22000 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
22010 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
22020 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
22030 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
22040 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
22050 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
22060 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
22070 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
22080 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
22090 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
220a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
220b0 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
220c0 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
220d0 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
220e0 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
220f0 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
22100 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
22110 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
22120 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22130 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
22140 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
22150 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
22160 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
22170 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
22180 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
22190 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
221a0 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
221c0 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
221d0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
221e0 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
221f0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lback..**.** The
22200 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
22210 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
22220 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
22230 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
22240 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
22250 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
22260 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
22270 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
22280 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
22290 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
222a0 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
222b0 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
222c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
222d0 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
222e0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
222f0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
22300 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
22310 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
22320 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
22330 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
22340 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
22350 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
22360 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
22370 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
22380 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
22390 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
223a0 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
223b0 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
223c0 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
223d0 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
223e0 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
223f0 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
22400 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
22410 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  ORMAL..**.** Do 
22420 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
22430 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
22440 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
22450 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
22460 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
22470 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
22480 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
22490 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
224a0 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
224b0 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
224c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
224d0 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
224e0 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
224f0 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
22500 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
22510 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
22520 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
22530 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22540 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
22550 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
22560 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
22570 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
22580 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
22590 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
225a0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
225b0 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
225c0 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
225d0 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
225e0 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
225f0 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
22600 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
22610 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
22620 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
22630 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
22640 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
22650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22660 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
22670 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
22680 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65  SetFlags(.  Page
22690 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
226a0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
226b0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
226c0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  el for */.  unsi
226d0 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
226e0 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61    /* Various fla
226f0 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  gs */.){.  unsig
22700 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c  ned level = pgFl
22710 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
22720 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20  HRONOUS_MASK;.  
22730 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31  assert( level>=1
22740 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a   && level<=3 );.
22750 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
22760 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
22770 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
22780 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
22790 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
227a0 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
227b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
227c0 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  :0;.  if( pPager
227d0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
227e0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
227f0 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
22800 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22810 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
22820 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
22830 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
22840 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22850 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22860 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61  NC_FULL;.    pPa
22870 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22880 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22890 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69  _FULL;.  }else i
228a0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
228b0 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
228c0 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  C ){.    pPager-
228d0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
228e0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
228f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
22900 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
22910 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
22920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
22930 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22940 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22950 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
22960 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22970 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22980 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  AL;.  }.  pPager
22990 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
229a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
229b0 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  gs;.  if( pPager
229c0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
229d0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
229e0 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59  cFlags |= WAL_SY
229f0 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
22a00 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61  .  }.  if( pgFla
22a10 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45  gs & PAGER_CACHE
22a20 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61  SPILL ){.    pPa
22a30 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
22a40 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  &= ~SPILLFLAG_OF
22a50 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  F;.  }else{.    
22a60 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
22a70 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
22a80 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  OFF;.  }.}.#endi
22a90 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
22aa0 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
22ab0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
22ac0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
22ad0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
22ae0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
22af0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
22b00 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
22b10 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
22b20 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
22b30 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
22b40 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
22b50 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
22b60 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
22b70 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
22b80 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
22b90 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
22ba0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
22bb0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
22bc0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
22bd0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
22be0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
22bf0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
22c00 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
22c10 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
22c20 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
22c30 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
22c40 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
22c50 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
22c60 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
22c70 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
22c80 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
22c90 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
22ca0 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
22cb0 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
22cc0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
22cd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
22ce0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
22cf0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
22d00 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
22d10 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
22d20 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
22d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
22d40 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
22d50 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
22d60 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
22d70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
22d80 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
22d90 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
22da0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
22db0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
22dc0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
22dd0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
22de0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
22df0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
22e00 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
22e10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
22e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22e30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
22e40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
22e50 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
22e60 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
22e70 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
22e80 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
22e90 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
22ea0 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
22eb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
22ec0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
22ed0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
22ee0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
22ef0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
22f00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
22f10 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
22f20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
22f30 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
22f40 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
22f50 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
22f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
22f70 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
22f80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22f90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
22fa0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
22fb0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
22fc0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
22fd0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
22fe0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
22ff0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
23000 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
23010 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
23020 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
23030 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
23040 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
23050 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
23060 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
23070 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
23080 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
23090 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
230a0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
230b0 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
230c0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
230d0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
230e0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
230f0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
23100 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
23110 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
23120 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
23130 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
23140 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
23150 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
23160 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
23170 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
23180 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
23190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
231a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
231b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
231c0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
231d0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
231e0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
231f0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
23200 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
23210 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
23220 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
23230 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
23240 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
23250 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
23260 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
23270 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
23280 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
23290 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
232a0 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
232b0 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
232c0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
232d0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
232e0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
232f0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
23300 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
23310 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
23320 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
23330 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
23340 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
23350 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23370 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
23380 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
23390 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
233a0 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
233b0 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
233c0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
233d0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
233e0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
233f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
23400 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
23410 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
23420 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  .){.  pPager->xB
23430 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
23440 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
23450 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
23460 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
23470 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69  lerArg;..  if( i
23480 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
23490 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ) ){.    void **
234a0 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
234b0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
234c0 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ler;.    assert(
234d0 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a   ((int(*)(void *
234e0 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73  ))(ap[0]))==xBus
234f0 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20  yHandler );.    
23500 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
23510 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
23520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
23530 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
23540 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
23550 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
23560 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
23570 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
23580 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
23590 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
235a0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
235b0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
235c0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
235d0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
235e0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
235f0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
23600 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
23610 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
23620 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
23630 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
23640 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
23650 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
23660 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
23670 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
23680 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
23690 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
236a0 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
236b0 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
236c0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
236d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
236e0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
236f0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
23700 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
23710 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
23720 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
23730 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
23740 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
23750 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
23760 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
23770 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
23780 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
23790 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
237a0 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
237b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
237c0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
237d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
237e0 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
237f0 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
23800 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
23810 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
23820 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
23830 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
23840 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
23850 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
23860 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
23870 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
23880 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
23890 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
238a0 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
238b0 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
238c0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
238d0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
238e0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
238f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
23900 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
23910 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
23920 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
23930 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
23940 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
23950 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
23960 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
23970 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
23980 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
23990 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
239a0 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
239b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
239c0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
239d0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
239e0 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
239f0 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
23a00 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
23a10 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
23a20 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
23a30 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
23a40 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
23a50 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
23a60 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
23a70 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
23a80 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
23a90 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
23aa0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
23ab0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
23ac0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
23ad0 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
23ae0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
23af0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23b00 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
23b10 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
23b20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
23b30 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
23b40 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
23b50 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
23b60 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
23b70 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
23b80 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
23b90 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
23ba0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
23bb0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
23bc0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
23bd0 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
23be0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
23bf0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
23c00 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
23c10 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
23c20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
23c30 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
23c40 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
23c50 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
23c60 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
23c70 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
23c80 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
23c90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
23ca0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
23cb0 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
23cc0 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
23cd0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
23ce0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
23cf0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
23d00 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
23d10 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
23d20 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
23d30 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
23d40 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
23d50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
23d60 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
23d70 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
23d80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
23d90 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
23da0 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
23db0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
23dc0 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
23dd0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
23de0 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
23df0 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
23e00 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
23e10 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
23e20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
23e30 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
23e40 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
23e50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23e60 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
23e70 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
23e80 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
23e90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23ea0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
23eb0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
23ec0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
23ed0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
23ee0 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
23ef0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
23f00 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
23f10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23f20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
23f30 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
23f40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
23f50 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
23f60 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
23f70 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
23f80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23f90 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
23fa0 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
23fb0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
23fc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
23fd0 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
23fe0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
23ff0 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42  ize = (Pgno)((nB
24000 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f  yte+pageSize-1)/
24010 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
24020 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
24030 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
24040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
24050 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
24060 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  New);.    }.  }.
24070 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
24080 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24090 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
240a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
240b0 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
240c0 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
240d0 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
240e0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
240f0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
24100 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
24110 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
24120 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
24130 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
24140 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61  (pPager);.    pa
24150 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70  gerFixMaplimit(p
24160 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
24170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24180 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
24190 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f  er to the "tempo
241a0 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65  rary page" buffe
241b0 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c  r held internall
241c0 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65  y.** by the page
241d0 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75  r.  This is a bu
241e0 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67  ffer that is big
241f0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
24200 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f  the.** entire co
24210 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62  ntent of a datab
24220 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  ase page.  This 
24230 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69  buffer is used i
24240 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72  nternally.** dur
24250 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ing rollback and
24260 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
24270 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20  tten whenever a 
24280 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
24290 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  rs.  But other m
242a0 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20  odules are free 
242b0 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61  to use it too, a
242c0 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20  s long as.** no 
242d0 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61  rollbacks are ha
242e0 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  ppening..*/.void
242f0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65   *sqlite3PagerTe
24300 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70  mpSpace(Pager *p
24310 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
24320 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
24330 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  ce;.}../*.** Att
24340 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
24350 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65  maximum database
24360 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d   page count if m
24370 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
24380 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  e. .** Make no c
24390 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65  hanges if mxPage
243a0 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
243b0 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72  tive.  And never
243c0 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d   reduce the.** m
243d0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
243e0 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72  t below the curr
243f0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
24400 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
24410 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78  Regardless of mx
24420 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
24430 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d   current maximum
24440 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
24450 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24460 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67  MaxPageCount(Pag
24470 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24480 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
24490 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70  xPage>0 ){.    p
244a0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
244b0 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73  mxPage;.  }.  as
244c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
244d0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
244e0 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c   );      /* Call
244f0 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61  ed only by OP_Ma
24500 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65  xPgcnt */.  asse
24510 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  rt( pPager->mxPg
24520 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no>=pPager->dbSi
24530 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78  ze );  /* OP_Max
24540 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74  Pgcnt enforces t
24550 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  his */.  return 
24560 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
24570 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
24580 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
24590 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
245a0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
245b0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
245c0 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
245d0 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
245e0 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
245f0 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
24600 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
24610 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
24620 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
24630 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
24640 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
24650 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
24660 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
24670 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
24680 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
24690 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
246a0 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
246b0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
246c0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
246d0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
246e0 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
246f0 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
24700 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
24710 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24720 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
24730 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
24740 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24750 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
24760 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
24770 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
24780 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
24790 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
247a0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
247b0 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
247c0 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
247d0 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
247e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
247f0 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
24800 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
24810 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
24820 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
24830 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
24840 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
24850 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
24860 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
24870 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
24880 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  o. .**.** If the
24890 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65   pager was opene
248a0 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  d on a transient
248b0 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65   file (zFilename
248c0 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65  ==""), or.** ope
248d0 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65  ned on a file le
248e0 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20  ss than N bytes 
248f0 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74  in size, the out
24900 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  put buffer is.**
24910 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49   zeroed and SQLI
24920 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
24930 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f  The rationale fo
24940 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
24950 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
24960 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
24970 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
24980 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61  s, and a new tra
24990 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72  nsient or.** zer
249a0 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65  o sized database
249b0 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68   has a header th
249c0 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  an consists enti
249d0 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a  rely of zeroes..
249e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20  **.** If any IO 
249f0 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d  error apart from
24a00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
24a10 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f  ORT_READ is enco
24a20 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20  untered,.** the 
24a30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24a40 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
24a50 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e  ller and the con
24a60 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
24a70 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e  output buffer un
24a80 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
24a90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
24aa0 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
24ab0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
24ac0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
24ad0 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
24ae0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24af0 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
24b00 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69   N);.  assert( i
24b10 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24b20 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
24b30 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54  pFile );..  /* T
24b40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
24b50 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74  nly called by bt
24b60 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ree immediately 
24b70 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20  after creating. 
24b80 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62   ** the Pager ob
24b90 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73  ject.  There has
24ba0 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70   not been an opp
24bb0 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e  ortunity to tran
24bc0 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57  sition.  ** to W
24bd0 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a  AL mode yet..  *
24be0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
24bf0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
24c00 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65   );..  if( isOpe
24c10 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
24c20 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
24c30 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
24c40 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
24c50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
24c60 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
24c70 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
24c80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24c90 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
24ca0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
24cb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24cc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24ce0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
24cf0 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
24d00 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
24d10 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a  ion is open on.*
24d20 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  * the pager. It 
24d30 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
24d40 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
24d50 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
24d60 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72  e..**.** However
24d70 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
24d80 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
24d90 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
24da0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
24db0 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
24dc0 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
24dd0 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
24de0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
24df0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
24e00 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
24e10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24e20 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
24e30 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
24e40 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24e50 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
24e60 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a  _FINISHED );.  *
24e70 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50  pnPage = (int)pP
24e80 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a  ager->dbSize;.}.
24e90 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
24ea0 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
24eb0 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e  type locktype on
24ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24ed0 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69  le. If.** a simi
24ee0 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c  lar or greater l
24ef0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
24f00 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
24f10 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a  on is a no-op.**
24f20 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49   (returning SQLI
24f30 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c  TE_OK immediatel
24f40 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  y)..**.** Otherw
24f50 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ise, attempt to 
24f60 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
24f70 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c  using sqlite3OsL
24f80 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a  ock(). Invoke .*
24f90 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * the busy callb
24fa0 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ack if the lock 
24fb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
24fc0 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65   available. Repe
24fd0 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65  at .** until the
24fe0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
24ff0 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20  eturns false or 
25000 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70  until the attemp
25010 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20  t to .** obtain 
25020 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
25030 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
25040 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
25050 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
25060 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
25070 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
25080 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  e lock. If the l
25090 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
250a0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65  successfully, se
250b0 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74  t the Pager.stat
250c0 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  e .** variable t
250d0 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72  o locktype befor
250e0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
250f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
25100 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
25110 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25120 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
25130 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
25160 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e */..  /* Check
25170 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69   that this is ei
25180 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65  ther a no-op (be
25190 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73  cause the reques
251a0 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a  ted lock is .  *
251b0 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c  * already held),
251c0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
251d0 72 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20  ransitions that 
251e0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
251f0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76  .  ** may be inv
25200 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63  oked during, acc
25210 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  ording to the co
25220 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a  mment above.  **
25230 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
25240 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20  Busyhandler().. 
25250 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
25260 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f  Pager->eLock>=lo
25270 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c  cktype).       |
25280 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
25290 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  ==NO_LOCK && loc
252a0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
252b0 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  CK).       || (p
252c0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  Pager->eLock==RE
252d0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c  SERVED_LOCK && l
252e0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
252f0 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20  VE_LOCK).  );.. 
25300 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70   do {.    rc = p
25310 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
25320 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  r, locktype);.  
25330 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
25340 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
25350 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
25360 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
25370 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65  dlerArg) );.  re
25380 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25390 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72  * Function asser
253a0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
253b0 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63  int(pPager) chec
253c0 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ks that one of t
253d0 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
253e0 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c   is true for all
253f0 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72   dirty pages cur
25400 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
25410 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20  ge-cache:.**.** 
25420 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75    a) The page nu
25430 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
25440 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
25450 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
25460 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64  *      current d
25470 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
25480 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a  n pages, OR.**.*
25490 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61  *   b) if the pa
254a0 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20  ge content were 
254b0 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20  written at this 
254c0 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  time, it would n
254d0 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65  ot.**      be ne
254e0 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
254f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
25500 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20  tent out to the 
25510 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
25520 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e      (as determin
25530 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73  ed by function s
25540 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
25550 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ))..**.** If the
25560 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72   condition asser
25570 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
25580 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
25590 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  ue, and the.** d
255a0 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74  irty page were t
255b0 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66  o be discarded f
255c0 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69  rom the cache vi
255d0 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  a the pagerStres
255e0 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  s().** routine, 
255f0 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f  pagerStress() wo
25600 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68  uld not write th
25610 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
25620 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ontent to.** the
25630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
25640 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74  If a savepoint t
25650 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20  ransaction were 
25660 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
25670 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e  r.** this happen
25680 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  ed, the correct 
25690 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62  behavior would b
256a0 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
256b0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
256c0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
256d0 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
256e0 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
256f0 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
25700 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
25710 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
25720 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
25730 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
25740 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
25750 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
25760 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
25770 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
25780 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
25790 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
257a0 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
257b0 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
257c0 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
257d0 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
257e0 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
257f0 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
25800 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
25810 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
25820 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25830 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
25840 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
25850 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
25860 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
25870 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
25880 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
25890 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
258a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
258b0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
258c0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
258d0 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
258e0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
258f0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
25900 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
25910 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
25920 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
25930 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
25940 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
25950 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
25960 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
25970 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
25980 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
25990 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
259a0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
259b0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
259c0 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
259d0 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
259e0 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
259f0 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
25a00 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
25a10 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
25a20 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
25a30 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
25a40 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
25a50 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
25a60 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
25a70 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
25a80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25a90 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
25aa0 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63  d right before c
25ab0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
25ac0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65  saction..** Once
25ad0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
25ae0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  as been called, 
25af0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
25b00 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a  must either be.*
25b10 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72  * rolled back or
25b20 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69   committed. It i
25b30 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61  s not safe to ca
25b40 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
25b50 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e   and.** then con
25b60 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f  tinue writing to
25b70 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
25b80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25b90 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
25ba0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25bb0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
25bc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
25bd0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
25be0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25bf0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
25c00 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
25c10 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
25c20 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20  ize = nPage;..  
25c30 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
25c40 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 63 61  the code here ca
25c50 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e 63  lled assertTrunc
25c60 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
25c70 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74  to.  ** ensure t
25c80 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65  hat all pages be
25c90 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61 77  ing truncated aw
25ca0 61 79 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ay by this opera
25cb0 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69  tion are,.  ** i
25cc0 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  f one or more sa
25cd0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65  vepoints are ope
25ce0 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  n, present in th
25cf0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
25d00 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  * journal so tha
25d10 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65  t they can be re
25d20 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 61  stored if the sa
25d30 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65  vepoint is rolle
25d40 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69  d.  ** back. Thi
25d50 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e  s is no longer n
25d60 65 63 65 73 73 61 72 79 20 61 73 20 74 68 69 73  ecessary as this
25d70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
25d80 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65   only.  ** calle
25d90 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63  d right before c
25da0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
25db0 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68  saction. So alth
25dc0 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50  ough the .  ** P
25dd0 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20  ager object may 
25de0 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20  still have open 
25df0 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65  savepoints (Page
25e00 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29  r.nSavepoint!=0)
25e10 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e  , .  ** they can
25e20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
25e30 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72  ck. So the asser
25e40 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25e50 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20  int() call.  ** 
25e60 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72  is no longer cor
25e70 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  rect. */.}.../*.
25e80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25e90 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
25ea0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
25eb0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
25ec0 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
25ed0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25ee0 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
25ef0 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
25f00 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
25f10 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
25f20 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
25f30 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
25f40 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
25f50 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
25f60 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
25f70 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
25f80 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
25f90 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
25fa0 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
25fb0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
25fc0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
25fd0 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
25fe0 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
25ff0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
26000 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
26010 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
26020 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
26030 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
26040 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
26050 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
26060 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
26070 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
26080 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
26090 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
260a0 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
260b0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
260c0 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
260d0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
260e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
260f0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
26100 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
26110 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26120 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
26130 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
26140 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26150 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
26160 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
26170 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
26180 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26190 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
261a0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
261b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
261c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
261d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
261e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  rc;.}../*.** Obt
261f0 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
26200 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70  to a memory mapp
26210 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66  ed page object f
26220 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  or page number p
26230 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77  gno. .** The new
26240 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65   object will use
26250 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61   the pointer pDa
26260 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ta, obtained fro
26270 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49  m xFetch()..** I
26280 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
26290 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69  t *ppPage to poi
262a0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
262b0 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  ge reference.** 
262c0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
262d0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
262e0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
262f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
26300 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20   set.** *ppPage 
26310 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50  to zero..**.** P
26320 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f  age references o
26330 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
26340 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
26350 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61   should be relea
26360 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e  sed.** by callin
26370 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  g pagerReleaseMa
26380 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
26390 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
263a0 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61  ireMapPage(.  Pa
263b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
263d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
263e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
26410 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61  r */.  void *pDa
26420 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
26430 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
26440 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68  ()'d data for th
26450 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
26460 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  dr **ppPage     
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26480 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61  OUT: Acquired pa
26490 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ge object */.){.
264a0 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264c0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
264d0 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72  ed page to retur
264e0 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
264f0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26500 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  t ){.    *ppPage
26510 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70   = p = pPager->p
26520 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
26530 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
26540 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69  reelist = p->pDi
26550 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
26560 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  ty = 0;.    mems
26570 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c  et(p->pExtra, 0,
26580 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
26590 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
265a0 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67  ppPage = p = (Pg
265b0 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  Hdr *)sqlite3Mal
265c0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
265d0 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e  gHdr) + pPager->
265e0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28  nExtra);.    if(
265f0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
26600 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
26610 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
26620 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
26630 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
26640 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
26650 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
26660 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45  .    }.    p->pE
26670 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  xtra = (void *)&
26680 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  p[1];.    p->fla
26690 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b  gs = PGHDR_MMAP;
266a0 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
266b0 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20  ;.    p->pPager 
266c0 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20  = pPager;.  }.. 
266d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74   assert( p->pExt
266e0 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31  ra==(void *)&p[1
266f0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
26700 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->pPage==0 );.  
26710 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
26720 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a  ==PGHDR_MMAP );.
26730 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
26740 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
26750 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
26760 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e  ==1 );..  p->pgn
26770 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70  o = pgno;.  p->p
26780 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
26790 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
267a0 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
267b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
267c0 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
267d0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
267e0 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
267f0 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
26800 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
26810 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
26820 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
26830 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26840 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
26850 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
26860 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
26870 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
26880 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26890 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
268a0 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
268b0 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
268c0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
268d0 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
268e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
268f0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
26900 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
26910 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
26920 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
26930 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
26940 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26950 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
26960 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
26970 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
26980 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
26990 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
269a0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
269b0 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
269c0 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
269d0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
269e0 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
269f0 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
26a00 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
26a10 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
26a20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
26a30 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
26a40 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(p);.  }.}...
26a50 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
26a60 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
26a70 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
26a80 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
26a90 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
26aa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
26ab0 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
26ac0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
26ad0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
26ae0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
26af0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
26b00 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
26b10 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
26b20 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
26b30 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
26b40 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
26b50 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
26b60 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
26b70 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
26b80 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
26b90 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
26ba0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
26bb0 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
26bc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
26bd0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
26be0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
26bf0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
26c00 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
26c10 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
26c20 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
26c30 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
26c40 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
26c50 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
26c60 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
26c70 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
26c80 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
26c90 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
26ca0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
26cb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
26cc0 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
26cd0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
26ce0 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
26cf0 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
26d00 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
26d10 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
26d20 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
26d30 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
26d40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
26d50 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
26d60 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
26d70 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
26d80 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
26d90 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
26da0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
26db0 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
26dc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
26dd0 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
26de0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
26df0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b        pPager->ck
26e00 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61  ptSyncFlags, pPa
26e10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
26e20 70 50 61 67 65 72 2d 3e 6f 74 61 4d 6f 64 65 3f  pPager->otaMode?
26e30 30 3a 70 54 6d 70 29 0a 20 20 29 3b 0a 20 20 70  0:pTmp).  );.  p
26e40 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
26e50 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
26e60 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
26e70 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
26e80 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
26e90 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
26ea0 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
26eb0 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
26ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
26ed0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
26ee0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
26ef0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
26f00 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
26f10 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
26f20 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
26f30 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
26f40 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
26f50 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
26f60 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
26f70 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
26f80 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
26f90 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
26fa0 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
26fb0 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
26fc0 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
26fd0 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
26fe0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
26ff0 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
27000 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
27010 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
27020 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
27030 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
27040 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
27050 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
27060 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
27070 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
27080 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27090 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
270a0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
270b0 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
270c0 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
270d0 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
270e0 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
270f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
27100 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
27110 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
27120 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27130 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27140 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27150 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
27160 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
27170 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
27180 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
27190 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
271a0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
271b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
271c0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
271d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
271e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
271f0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
27200 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
27210 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27220 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
27230 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
27240 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
27250 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
27260 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
27270 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
27280 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
27290 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
272a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
272b0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
272c0 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
272d0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
272e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
272f0 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
27300 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
27310 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
27320 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
27330 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
27340 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
27350 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
27360 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
27370 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
27380 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27390 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
273a0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
273b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
273c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
273d0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
273e0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
273f0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
27400 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
27410 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
27420 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
27430 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
27440 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
27450 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
27460 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
27470 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
27480 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
27490 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
274a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
274b0 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
274c0 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
274d0 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
274e0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
274f0 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
27500 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
27510 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
27520 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
27530 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
27540 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
27550 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
27560 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
27570 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
27580 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
27590 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
275a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
275b0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
275c0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
275d0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
275e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
275f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
27600 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
27610 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
27620 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
27630 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
27640 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
27650 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
27660 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
27670 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
27680 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a  .**   * If the j
27690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
276a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
276b0 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74  nal file, no act
276c0 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  ion need.**     
276d0 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  be taken..**.** 
276e0 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69    * Otherwise, i
276f0 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
27700 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
27710 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  e SAFE_APPEND pr
27720 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74  operty,.**     t
27730 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
27740 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ld of the most r
27750 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20  ecently written 
27760 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
27770 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64  *     is updated
27780 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
27790 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61  number of journa
277a0 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68  l records that h
277b0 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  ave.**     been 
277c0 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e  written followin
277d0 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67  g it. If the pag
277e0 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  er is operating 
277f0 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20  in full-sync.** 
27800 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74      mode, then t
27810 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27820 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65  is synced before
27830 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75   this field is u
27840 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
27850 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20  * If the device 
27860 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27870 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20   the SEQUENTIAL 
27880 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a  property, then .
27890 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66  **     journal f
278a0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
278b0 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75  *.** Or, in pseu
278c0 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  do-code:.**.**  
278d0 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d   if( NOT <in-mem
278e0 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a  ory journal> ){.
278f0 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
27900 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a  AFE_APPEND ){.**
27910 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c         if( <full
27920 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53  -sync mode> ) xS
27930 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
27940 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75  e>);.**       <u
27950 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64  pdate nRec field
27960 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20  >.**     } .**  
27970 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45     if( NOT SEQUE
27980 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a  NTIAL ) xSync(<j
27990 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
279a0 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73  *   }.**.** If s
279b0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
279c0 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
279d0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
279e0 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
279f0 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
27a00 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
27a10 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
27a20 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
27a30 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
27a40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
27a50 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
27a60 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27a70 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
27a80 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
27a90 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
27aa0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
27ab0 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72  newHdr){.  int r
27ac0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27ae0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
27af0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27b00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
27b10 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
27b20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
27b30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
27b40 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
27b50 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
27b60 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
27b70 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
27b80 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
27b90 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  Pager) );..  rc 
27ba0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
27bb0 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67  clusiveLock(pPag
27bc0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
27bd0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
27be0 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  n rc;..  if( !pP
27bf0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
27c00 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
27c10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
27c20 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
27c30 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
27c40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
27c50 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
27c60 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
27c70 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
27c80 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
27c90 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
27ca0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
27cb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27cc0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27cd0 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
27ce0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
27cf0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
27d00 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
27d10 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
27d20 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
27d30 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
27d40 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
27d50 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
27d60 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
27d70 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
27d80 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
27d90 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
27da0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
27db0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
27dc0 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
27dd0 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
27de0 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
27df0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
27e00 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
27e10 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
27e20 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
27e30 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
27e40 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
27e50 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
27e60 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
27e70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
27e80 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
27e90 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
27ea0 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
27eb0 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
27ec0 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
27ed0 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
27ee0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
27ef0 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
27f00 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
27f10 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
27f20 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
27f30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27f40 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
27f50 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
27f60 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
27f70 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
27f80 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
27f90 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
27fa0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
27fb0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
27fc0 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
27fd0 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
27fe0 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
27ff0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
28000 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
28010 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
28020 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
28030 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
28040 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
28050 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
28060 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
28070 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
28080 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28090 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
280a0 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
280b0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
280c0 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
280d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
280e0 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
280f0 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
28100 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
28110 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
28120 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
28130 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
28140 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
28150 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
28160 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28170 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
28180 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
28190 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
281a0 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
281b0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
281c0 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
281d0 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
281e0 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
281f0 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
28200 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
28210 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
28220 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
28230 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
28240 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
28250 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
28260 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
28270 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
28280 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
28290 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
282a0 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
282b0 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
282c0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
282d0 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
282e0 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
282f0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
28300 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
28310 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
28320 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
28330 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
28340 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
28350 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
28360 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
28370 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
28380 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
28390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
283a0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
283b0 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
283c0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
283d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
283e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
283f0 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
28400 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
28410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
28420 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
28430 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
28440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28450 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
28460 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
28470 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
28480 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
28490 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
284a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
284b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
284c0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
284d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
284e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
284f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
28500 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
28510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28520 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
28530 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
28540 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
28550 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
28560 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
28570 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
28580 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
28590 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
285a0 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
285b0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
285c0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
285d0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
285e0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
285f0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28600 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
28610 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
28620 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
28630 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
28640 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
28650 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
28660 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
28670 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
28680 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
28690 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
286a0 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
286b0 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
286c0 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
286d0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
286e0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
286f0 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
28700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
28710 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
28720 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
28730 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
28740 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
28750 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
28760 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
28770 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
28780 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
28790 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
287a0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
287b0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
287c0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
287d0 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
287e0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
287f0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
28800 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
28810 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28820 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28830 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
28840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28860 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28870 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
28880 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
28890 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
288a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
288b0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
288c0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
288d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
288e0 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
288f0 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
28900 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
28910 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
28920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28950 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
28960 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28970 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
28980 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28990 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
289a0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
289b0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
289c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
289d0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
289e0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
289f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
28a00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
28a10 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c  ager->syncFlags|
28a20 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
28a30 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
28a40 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
28a50 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
28a60 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
28a70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28a90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28aa0 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72   }..      pPager
28ab0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28ac0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28ad0 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  f;.      if( new
28ae0 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53  Hdr && 0==(iDc&S
28af0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
28b00 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
28b10 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
28b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
28b30 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
28b40 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
28b50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28b60 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28b70 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
28b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
28b90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
28ba0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28bb0 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
28bc0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    /* Unless the 
28bd0 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79  pager is in noSy
28be0 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
28bf0 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
28c00 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  st .  ** success
28c10 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69  fully synced. Ei
28c20 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20  ther way, clear 
28c30 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
28c40 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a  YNC flag on .  *
28c50 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a  * all pages..  *
28c60 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
28c70 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
28c80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
28c90 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
28ca0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
28cb0 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72  R_DBMOD;.  asser
28cc0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
28cd0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
28ce0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28cf0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
28d00 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
28d10 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
28d20 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
28d30 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
28d40 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
28d50 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
28d60 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
28d70 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
28d80 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
28d90 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
28da0 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
28db0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
28dc0 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
28dd0 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
28de0 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
28df0 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
28e00 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
28e10 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
28e20 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
28e30 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
28e40 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
28e50 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
28e60 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
28e70 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
28e80 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
28e90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
28ea0 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
28eb0 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
28ec0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
28ed0 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
28ee0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
28ef0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
28f00 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
28f10 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
28f20 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
28f30 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
28f40 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
28f50 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
28f60 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
28f70 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
28f80 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
28f90 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
28fa0 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
28fb0 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
28fc0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
28fd0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
28fe0 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
28ff0 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
29000 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
29010 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
29020 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
29030 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
29040 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
29050 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
29060 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
29070 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
29080 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
29090 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
290a0 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
290b0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
290c0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
290d0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
290e0 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
290f0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
29100 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
29110 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
29120 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
29130 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
29140 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29150 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
29160 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
29170 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
29180 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
29190 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
291a0 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
291b0 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
291c0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
291d0 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
291e0 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
291f0 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
29200 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
29210 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
29220 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
29230 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29240 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
29250 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
29260 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
29270 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
29280 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
29290 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
292a0 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
292b0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
292c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
292d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
292e0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67  ite_pagelist(Pag
292f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
29300 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  r *pList){.  int
29310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
29340 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
29350 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
29360 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62  called for rollb
29370 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52  ack pagers in WR
29380 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65  ITER_DBMOD state
29390 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  . */.  assert( !
293a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
293b0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
293c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
293d0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
293e0 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
293f0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
29400 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
29410 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
29420 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
29430 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
29440 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
29450 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
29460 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
29470 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
29480 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
29490 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
294a0 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
294b0 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
294c0 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
294d0 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
294e0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
294f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
29500 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
29510 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
29520 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
29530 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
29540 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
29550 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
29560 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
29570 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  gs);.  }..  /* B
29580 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
29590 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20  write, give the 
295a0 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68  VFS a hint of wh
295b0 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a  at the final.  *
295c0 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c  * file size will
295d0 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65   be..  */.  asse
295e0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
295f0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
29600 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28  er->fd) );.  if(
29610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc==SQLITE_OK .
29620 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
29630 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d  HintSize<pPager-
29640 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70  >dbSize.   && (p
29650 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20  List->pDirty || 
29660 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67  pList->pgno>pPag
29670 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a  er->dbHintSize).
29680 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
29690 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
296a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
296b0 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
296c0 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
296d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
296e0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
296f0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
29700 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
29710 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20  T, &szFile);.   
29720 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
29730 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
29740 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Size;.  }..  whi
29750 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
29760 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
29770 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c    Pgno pgno = pL
29780 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20  ist->pgno;..    
29790 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
297a0 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
297b0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
297c0 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
297d0 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
297e0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
297f0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
29800 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
29810 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
29820 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
29830 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
29840 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
29850 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
29860 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
29870 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
29880 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
29890 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
298a0 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74   ** Also, do not
298b0 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70   write out any p
298c0 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65  age that has the
298d0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
298e0 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65  E flag.    ** se
298f0 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65  t (set by sqlite
29900 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
29910 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ))..    */.    i
29920 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
29930 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
29940 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
29950 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
29960 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
29970 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
29980 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
29990 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ze;   /* Offset 
299a0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
299b0 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299e0 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
299f0 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20  e */    ..      
29a00 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e  assert( (pList->
29a10 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
29a20 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
29a30 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
29a40 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
29a50 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
29a60 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20  r(pList);..     
29a70 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
29a80 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
29a90 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
29aa0 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
29ab0 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
29ac0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
29ad0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
29ae0 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
29af0 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
29b00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
29b10 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
29b20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
29b30 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
29b40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
29b50 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
29b60 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
29b70 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
29b80 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
29b90 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
29ba0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
29bb0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
29bc0 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
29bd0 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
29be0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
29bf0 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
29c00 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
29c10 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
29c20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
29c30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
29c40 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
29c50 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
29c60 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
29c70 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
29c80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
29c90 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
29ca0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
29cb0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
29cc0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
29cd0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
29ce0 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
29cf0 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20  TAT_WRITE]++;.. 
29d00 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
29d10 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
29d20 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
29d30 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
29d40 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
29d50 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
29d60 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
29d70 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
29d80 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
29d90 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
29da0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
29db0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
29dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29dd0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
29de0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
29df0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
29e00 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
29e10 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
29e20 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
29e30 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
29e40 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
29e50 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
29e60 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
29e70 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
29e80 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
29e90 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
29ea0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
29eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
29ec0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
29ed0 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74  List);.    pList
29ee0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
29ef0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
29f00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
29f10 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
29f20 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
29f30 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
29f40 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
29f50 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
29f60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
29f70 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
29f80 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
29f90 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
29fa0 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
29fb0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
29fc0 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
29fd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
29fe0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
29ff0 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
2a000 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2a010 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
2a020 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
2a030 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a040 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
2a050 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a060 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
2a070 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2a080 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2a090 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
2a0a0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2a0b0 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
2a0c0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
2a0d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2a0e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a0f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2a100 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2a110 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
2a120 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2a130 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
2a140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a150 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
2a160 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
2a170 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
2a180 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
2a190 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49  b-journal. .** I
2a1a0 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
2a1b0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2a1c0 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69  to use subjRequi
2a1d0 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65  resPage() to che
2a1e0 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ck .** that it i
2a1f0 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
2a200 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
2a210 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2a220 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2a230 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
2a240 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2a250 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
2a260 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
2a270 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
2a280 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
2a290 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
2a2a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2a2b0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
2a2c0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2a2d0 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
2a2e0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
2a2f0 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2a300 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
2a310 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
2a320 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
2a330 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
2a340 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
2a350 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
2a360 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
2a370 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
2a380 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
2a390 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2a3a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a3b0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
2a3c0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2a3d0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
2a3e0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2a3f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2a400 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
2a410 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
2a420 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
2a430 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
2a440 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
2a450 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2a460 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2a470 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2a480 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
2a490 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2a4a0 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
2a4b0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2a4c0 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
2a4d0 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
2a4e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
2a4f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2a500 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
2a510 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67  geInJournal(pPag
2a520 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20  er, pPg) .      
2a530 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
2a540 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2a550 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
2a560 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2a570 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
2a580 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
2a590 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
2a5a0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
2a5b0 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
2a5c0 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
2a5d0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
2a5e0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
2a5f0 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
2a600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a610 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
2a620 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2a630 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
2a640 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  et = (i64)pPager
2a650 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
2a660 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2a670 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2a680 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44  a2;.  .      COD
2a690 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
2a6a0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
2a6b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2a6c0 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
2a6d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2a6e0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
2a6f0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2a700 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2a710 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2a720 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
2a730 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  ts(pPager->sjfd,
2a740 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
2a750 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2a760 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a770 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a780 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2a790 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
2a7a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2a7b0 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
2a7c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a7d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a7e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
2a7f0 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20  er->nSubRec++;. 
2a800 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a810 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
2a820 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54  );.    rc = addT
2a830 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2a840 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
2a850 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2a860 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a870 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2a880 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
2a890 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
2a8a0 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
2a8b0 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
2a8c0 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
2a8d0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
2a8e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2a8f0 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
2a900 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
2a910 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
2a920 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
2a930 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
2a940 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
2a950 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
2a960 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
2a970 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
2a980 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
2a990 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
2a9a0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
2a9b0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
2a9c0 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
2a9d0 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
2a9e0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
2a9f0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
2aa00 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
2aa10 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
2aa20 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
2aa30 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
2aa40 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
2aa50 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
2aa60 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
2aa70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2aa80 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
2aa90 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
2aaa0 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
2aab0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
2aac0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2aad0 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
2aae0 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
2aaf0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
2ab00 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
2ab10 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2ab20 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2ab30 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2ab40 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
2ab50 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
2ab60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2ab70 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
2ab80 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
2ab90 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
2aba0 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
2abb0 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
2abc0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2abd0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2abe0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2abf0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2ac00 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2ac10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ac20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
2ac30 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
2ac40 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2ac50 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
2ac60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ac70 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2ac80 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
2ac90 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
2aca0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2acb0 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
2acc0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2acd0 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73   NOSYNC bit is s
2ace0 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
2acf0 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
2ad00 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
2ad10 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
2ad20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
2ad30 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
2ad40 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
2ad50 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
2ad60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ad70 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
2ad80 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
2ad90 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
2ada0 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
2adb0 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
2adc0 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
2add0 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e  pill ROLLBACK an
2ade0 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62  d OFF bits inhib
2adf0 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70  its all cache sp
2ae00 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61  illing.  ** rega
2ae10 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2ae20 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20  r or not a sync 
2ae30 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68  is required.  Th
2ae40 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  is is set during
2ae50 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b  .  ** a rollback
2ae60 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71 75   or by user requ
2ae70 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  est, respectivel
2ae80 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69  y..  **.  ** Spi
2ae90 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72  lling is also pr
2aea0 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e  ohibited when in
2aeb0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
2aec0 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64  since that could
2aed0 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61  .  ** lead to da
2aee0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
2aef0 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72  n.   In the curr
2af00 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
2af10 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69  on it .  ** is i
2af20 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71  mpossible for sq
2af30 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
2af40 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  () to be called 
2af50 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
2af60 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e  =3.  ** while in
2af70 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2af80 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d  , hence it is im
2af90 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
2afa0 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a  s routine to.  *
2afb0 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74  * be called in t
2afc0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2afd0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77   Nevertheless, w
2afe0 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45  e include a NEVE
2aff0 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f  R().  ** test fo
2b000 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2b010 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64  e as a safeguard
2b020 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20   against future 
2b030 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  changes..  */.  
2b040 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2b050 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2b060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b070 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2b080 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2b090 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2b0a0 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  CK );.  testcase
2b0b0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b0c0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b0d0 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61  _OFF );.  testca
2b0e0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2b0f0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2b100 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69  AG_NOSYNC );.  i
2b110 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
2b120 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50  Spill.   && ((pP
2b130 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b140 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f   & (SPILLFLAG_RO
2b150 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47  LLBACK|SPILLFLAG
2b160 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20  _OFF))!=0.      
2b170 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  || (pPg->flags &
2b180 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2b190 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72  )!=0).  ){.    r
2b1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b1b0 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69  .  }..  pPg->pDi
2b1c0 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2b1d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2b1e0 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
2b1f0 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
2b200 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
2b210 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
2b220 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
2b230 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20  resPage(pPg) ){ 
2b240 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
2b250 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2b260 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20   .    }.    if( 
2b270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b280 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2b290 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
2b2a0 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20  r, pPg, 0, 0);. 
2b2b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2b2c0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2b2d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
2b2e0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2b2f0 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
2b300 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2b310 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
2b320 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2b330 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
2b340 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
2b350 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2b360 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  ager, 1);.    }.
2b370 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
2b380 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2b390 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72  this page is lar
2b3a0 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
2b3b0 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20  rent size of.   
2b3c0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2b3d0 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
2b3e0 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
2b3f0 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
2b400 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69  rnal..    ** Thi
2b410 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
2b420 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
2b430 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
2b440 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
2b450 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77     ** actually w
2b460 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
2b470 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
2b480 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
2b490 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66  * Consider the f
2b4a0 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63  ollowing sequenc
2b4b0 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20  e of events:.   
2b4c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47   **.    **   BEG
2b4d0 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c  IN;.    **     <
2b4e0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a  journal page X>.
2b4f0 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69      **     <modi
2b500 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  fy page X>.    *
2b510 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
2b520 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sp;.    **      
2b530 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
2b540 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
2b550 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s>.    **       
2b560 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
2b570 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52   X).    **     R
2b580 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
2b590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2b5a0 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
2b5b0 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
2b5c0 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
2b5d0 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
2b5e0 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  n.    ** out to 
2b5f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b600 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64  e, but will be d
2b610 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
2b620 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20  cache. Then,.   
2b630 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
2b640 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
2b650 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
2b660 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
2b670 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61  l read.    ** da
2b680 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
2b690 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
2b6a0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
2b6b0 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
2b6c0 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  .    ** was when
2b6d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2b6e0 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
2b6f0 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
2b700 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20  VEPOINT sp".    
2b710 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
2b720 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2b730 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
2b740 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
2b750 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
2b760 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
2b770 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
2b780 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
2b790 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2b7a0 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
2b7b0 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  it will.    ** b
2b7c0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
2b7d0 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
2b7e0 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
2b7f0 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20  CK TO sp" is .  
2b800 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
2b810 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
2b820 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d  VER(.        rc=
2b830 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2b840 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
2b850 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65  dbSize && subjRe
2b860 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
2b870 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72      ) ){.      r
2b880 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
2b890 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
2b8a0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
2b8b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b8c0 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
2b8d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b8e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
2b8f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b900 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
2b910 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2b920 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2b930 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2b940 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
2b950 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
2b960 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
2b970 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
2b980 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
2b990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b9a0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2b9b0 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
2b9c0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2b9d0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2b9e0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
2b9f0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
2ba00 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
2ba10 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2ba20 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
2ba30 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2ba40 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2ba50 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
2ba60 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
2ba70 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
2ba80 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
2ba90 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
2baa0 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
2bab0 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
2bac0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
2bad0 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
2bae0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
2baf0 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
2bb00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2bb10 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
2bb20 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
2bb30 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
2bb40 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
2bb50 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
2bb60 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
2bb70 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
2bb80 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
2bb90 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
2bba0 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
2bbb0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
2bbc0 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
2bbd0 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
2bbe0 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
2bbf0 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
2bc00 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
2bc10 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
2bc20 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
2bc30 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
2bc40 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
2bc50 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
2bc60 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
2bc70 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
2bc80 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
2bc90 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
2bca0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2bcb0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
2bcc0 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
2bcd0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
2bce0 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
2bcf0 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2bd00 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
2bd10 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2bd20 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
2bd30 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2bd40 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2bd50 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2bd60 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2bd70 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2bd80 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2bd90 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2bda0 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2bdb0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2bdc0 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2bdd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2bde0 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2bdf0 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2be00 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2be10 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2be20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2be30 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2be40 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2be50 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2be60 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2be70 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2be80 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2be90 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2bea0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2beb0 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2bec0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2bed0 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2bee0 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2bef0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2bf00 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2bf10 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2bf20 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2bf30 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2bf40 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2bf50 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2bf60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2bf70 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2bf80 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2bf90 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2bfa0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2bfb0 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2bfc0 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2bfd0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2bfe0 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2bff0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2c010 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2c020 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2c030 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2c040 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2c050 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2c060 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2c070 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c080 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2c090 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2c0a0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2c0b0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2c0c0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2c0d0 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2c0e0 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2c0f0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2c100 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2c110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2c120 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2c130 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2c140 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2c150 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2c160 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2c170 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2c180 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2c190 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2c1a0 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2c1b0 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2c1c0 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2c1d0 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2c1e0 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2c1f0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2c200 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2c210 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2c220 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c230 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2c240 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2c250 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2c260 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2c270 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2c280 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2c290 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2c2a0 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2c2b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2c2c0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2c2d0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2c2e0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2c2f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2c300 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2c310 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2c320 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2c330 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2c340 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c350 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2c360 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2c370 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2c380 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2c390 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c3a0 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2c3b0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2c3c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2c3d0 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2c3e0 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2c3f0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2c400 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2c410 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2c420 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2c430 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2c440 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2c450 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2c460 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2c470 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2c480 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2c490 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2c4a0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2c4b0 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2c4c0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c4d0 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2c4e0 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2c4f0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2c500 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2c510 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2c520 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2c530 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2c540 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2c550 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2c560 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2c570 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2c580 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2c590 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2c5a0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2c5b0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2c5c0 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
2c5d0 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
2c5e0 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
2c5f0 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
2c600 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
2c610 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
2c620 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
2c630 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
2c640 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
2c650 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
2c660 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
2c670 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
2c680 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
2c690 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
2c6a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
2c6b0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
2c6c0 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
2c6d0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2c6e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
2c6f0 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
2c700 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
2c710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
2c720 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2c730 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
2c740 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
2c750 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2c760 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2c770 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2c780 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
2c790 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2c7a0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c7b0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2c7c0 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
2c7d0 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
2c7e0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2c7f0 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2c800 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2c810 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2c820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c830 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2c840 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2c850 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2c860 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mDb = 1;.    if(
2c870 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c880 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2c890 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c8a0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2c8b0 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  0, zFilename);. 
2c8c0 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61       if( zPathna
2c8d0 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20  me==0  ) return 
2c8e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c8f0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2c900 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c910 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2c920 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2c930 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2c940 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2c950 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2c960 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2c970 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2c980 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2c990 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2c9a0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2c9b0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2c9c0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2c9d0 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2c9e0 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2c9f0 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2ca00 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2ca10 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2ca20 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2ca30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2ca40 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2ca50 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2ca60 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2ca70 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2ca80 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2ca90 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2caa0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2cab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2cac0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2cad0 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b  }.    zPathname[
2cae0 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
2caf0 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
2cb00 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
2cb10 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
2cb20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2cb30 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
2cb40 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2cb50 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
2cb60 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74  hname);.    nPat
2cb70 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2cb80 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2cb90 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69  e);.    z = zUri
2cba0 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71   = &zFilename[sq
2cbb0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
2cbc0 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20  ilename)+1];.   
2cbd0 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2cbe0 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2cbf0 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2cc00 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2cc10 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2cc20 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d      }.    nUri =
2cc30 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a   (int)(&z[1] - z
2cc40 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Uri);.    assert
2cc50 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20  ( nUri>=0 );.   
2cc60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cc70 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
2cc80 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
2cc90 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
2cca0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2ccb0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
2ccc0 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
2ccd0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
2cce0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
2ccf0 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
2cd00 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
2cd10 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
2cd20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
2cd30 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
2cd40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
2cd50 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
2cd60 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
2cd70 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
2cd80 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
2cd90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2cda0 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
2cdb0 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
2cdc0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
2cdd0 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
2cde0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2cdf0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2ce00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2ce10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ce20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2ce30 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2ce40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2ce50 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2ce60 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2ce70 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2ce80 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2ce90 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2cea0 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2ceb0 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2cec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2ced0 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2cee0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2cef0 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2cf00 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2cf10 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2cf20 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2cf30 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2cf40 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2cf50 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2cf60 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2cf70 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2cf80 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2cf90 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2cfa0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2cfb0 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2cfc0 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2cfd0 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2cfe0 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2cff0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2d000 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2d010 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2d020 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2d030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2d040 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2d050 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2d060 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2d070 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2d080 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2d090 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2d0a0 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2d0b0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2d0c0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2d0d0 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2d0e0 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2d0f0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2d100 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2d110 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2d120 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2d130 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2d140 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2d150 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2d160 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2d170 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2d180 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2d190 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2d1a0 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2d1b0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2d1c0 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2d1d0 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2d1e0 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2d1f0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2d200 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2d210 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2d220 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2d230 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2d240 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2d250 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2d260 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2d270 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2d280 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d290 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2d2a0 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2d2b0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2d2c0 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2d2d0 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2d2e0 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2d2f0 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2d300 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d310 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2d320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2d330 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
2d340 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2d350 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2d360 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2d370 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2d380 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d390 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2d3a0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2d3b0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2d3c0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2d3d0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2d3e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2d3f0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2d400 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d410 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2d420 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2d430 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2d440 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2d450 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2d460 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2d470 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2d480 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2d490 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2d4a0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2d4b0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2d4c0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2d4d0 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2d4e0 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2d4f0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2d500 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2d510 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2d520 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2d530 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2d540 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2d550 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2d560 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2d570 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d580 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2d590 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d5a0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2d5b0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2d5c0 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2d5d0 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2d5e0 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2d5f0 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2d600 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d610 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2d620 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d630 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2d640 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2d650 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2d660 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2d670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2d680 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2d690 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2d6a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2d6b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d6c0 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2d6d0 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2d6e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d6f0 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2d700 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d710 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2d720 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d730 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2d740 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2d750 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2d760 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d770 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d780 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d790 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2d7a0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2d7b0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2d7c0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2d7d0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2d7e0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2d7f0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2d800 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2d810 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2d820 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2d830 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2d840 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2d850 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d860 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2d870 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2d880 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2d890 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2d8a0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2d8b0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d8c0 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2d8d0 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2d8e0 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2d8f0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2d900 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2d910 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2d920 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2d930 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2d940 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2d950 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2d960 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2d970 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2d980 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2d990 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2d9a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2d9b0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2d9c0 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2d9d0 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2d9e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2d9f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2da00 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2da10 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2da20 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2da30 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2da40 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2da50 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2da60 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2da70 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2da80 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2da90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2daa0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
2dab0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2dac0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2dad0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2dae0 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e       if( !readOn
2daf0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
2db00 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2db10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
2db20 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2db30 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2db40 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2db50 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2db60 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2db70 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2db80 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2db90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2dba0 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2dbb0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2dbc0 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2dbd0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2dbe0 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2dbf0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dc00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2dc10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2dc20 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2dc30 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2dc40 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
2dc50 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
2dc60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2dc70 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2dc80 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2dc90 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2dca0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2dcb0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2dcc0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2dcd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2dce0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2dcf0 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2dd00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2dd10 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2dd20 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dd30 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2dd40 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2dd50 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2dd60 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2dd70 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2dd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2dd90 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2dda0 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2ddb0 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2ddc0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2ddd0 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2dde0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2ddf0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2de00 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
2de10 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2de20 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2de30 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2de40 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20  "nolock", 0);.  
2de50 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53      if( (iDc & S
2de60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55  QLITE_IOCAP_IMMU
2de70 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20  TABLE)!=0.      
2de80 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   || sqlite3_uri_
2de90 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2dea0 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20  e, "immutable", 
2deb0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2dec0 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  vfsFlags |= SQLI
2ded0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2dee0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2def0 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66   act_like_temp_f
2df00 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
2df10 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2df20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2df30 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2df40 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2df50 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2df60 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2df70 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2df80 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2df90 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2dfa0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2dfb0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2dfc0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2dfd0 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2dfe0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2dff0 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2e000 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2e010 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2e020 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2e030 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2e040 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2e050 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2e060 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2e070 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2e080 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2e090 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2e0a0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2e0b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2e0c0 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75  s branch also ru
2e0d0 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72  ns for files mar
2e0e0 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ked as immutable
2e0f0 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69  ..    */ .act_li
2e100 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20  ke_temp_file:.  
2e110 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2e120 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2e130 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2e140 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  R;     /* Preten
2e150 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  d we already hav
2e160 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  e a lock */.    
2e170 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2e180 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20  EXCLUSIVE_LOCK; 
2e190 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e1a0 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56   are in EXCLUSIV
2e1b0 45 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 2a  E locking mode *
2e1c0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  /.    pPager->no
2e1d0 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Lock = 1;       
2e1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2e1f0 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  o locking */.   
2e200 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2e210 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2e220 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2e230 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2e240 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2e250 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2e260 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2e270 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2e280 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2e290 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2e2a0 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2e2b0 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2e2c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e2d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2e2e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2e2f0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2e300 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2e310 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2e320 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2e330 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2e340 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e350 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2e360 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2e370 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69  e object. */.  i
2e380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e390 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e3a0 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2e3b0 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e     nExtra = ROUN
2e3c0 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  D8(nExtra);.    
2e3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2e3e0 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2e3f0 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2e400 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2e420 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2e430 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2e440 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2e450 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  che);.  }..  /* 
2e460 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2e470 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65  rred above, free
2e480 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72 75   the  Pager stru
2e490 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
2e4a0 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
2e4b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e4c0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2e4d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2e4e0 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2e4f0 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
2e500 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
2e510 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e520 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
2e530 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41  rn rc;.  }..  PA
2e540 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
2e550 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
2e560 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
2e570 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
2e580 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
2e590 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
2e5a0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
2e5b0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
2e5c0 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
2e5d0 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
2e5e0 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61  ournal;.  /* pPa
2e5f0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
2e600 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e610 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
2e620 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e630 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
2e640 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e650 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2e660 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
2e670 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2e680 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
2e690 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2e6a0 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
2e6b0 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
2e6c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e6d0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
2e6e0 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
2e6f0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
2e700 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
2e710 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
2e720 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
2e730 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2e740 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2e750 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
2e760 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
2e770 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2e780 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2e790 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2e7a0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2e7b0 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
2e7c0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2e7d0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
2e7e0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2e7f0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
2e800 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2e810 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
2e820 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
2e830 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
2e840 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
2e850 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e  assert( useJourn
2e860 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  al || pPager->te
2e870 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67  mpFile );.  pPag
2e880 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
2e890 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2e8a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
2e8b0 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
2e8c0 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
2e8d0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2e8e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2e8f0 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2e900 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e910 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2e920 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e930 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2e940 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2e950 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2e960 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2e970 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2e980 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2e990 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2e9a0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2e9b0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2e9c0 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2e9d0 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2e9e0 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2e9f0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2ea00 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2ea10 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2ea20 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2ea30 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ea40 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2ea50 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ea60 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2ea70 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2ea80 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2ea90 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2eaa0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2eab0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2eac0 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2ead0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2eae0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2eaf0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2eb00 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2eb10 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2eb20 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2eb30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2eb40 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2eb50 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2eb60 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2eb70 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2eb80 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2eb90 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2eba0 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2ebb0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2ebc0 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2ebd0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2ebe0 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2ebf0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2ec00 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2ec10 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2ec20 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2ec30 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2ec40 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  )); */.  /* pPag
2ec50 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  er->szMmap = SQL
2ec60 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
2ec70 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65  _SIZE // will be
2ec80 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20   set by btree.c 
2ec90 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
2eca0 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
2ecb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ecc0 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
2ecd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ece0 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c  e has not be del
2ecf0 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20  eted or renamed 
2ed00 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65  out from.** unde
2ed10 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65  r the pager.  Re
2ed20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2ed30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2ed40 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20  s still were it 
2ed50 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f  ought.** to be o
2ed60 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  n disk.  Return 
2ed70 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45  non-zero (SQLITE
2ed80 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
2ed90 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  D or some other 
2eda0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72  error.** code fr
2edb0 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  om sqlite3OsAcce
2edc0 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74  ss()) if the dat
2edd0 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d  abase has gone m
2ede0 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  issing..*/.stati
2edf0 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73  c int databaseIs
2ee00 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70  Unmoved(Pager *p
2ee10 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48  Pager){.  int bH
2ee20 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69  asMoved = 0;.  i
2ee30 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
2ee40 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2ee50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ee60 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
2ee70 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74  >dbSize==0 ) ret
2ee80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ee90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2eea0 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50  >zFilename && pP
2eeb0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2eec0 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  0] );.  rc = sql
2eed0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2eee0 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
2eef0 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
2ef00 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64  OVED, &bHasMoved
2ef10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2ef20 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
2ef30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41      /* If the HA
2ef40 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e  S_MOVED file-con
2ef50 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d  trol is unimplem
2ef60 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ented, assume th
2ef70 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  at the file.    
2ef80 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
2ef90 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20  moved.  That is 
2efa0 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62  the historical b
2efb0 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74  ehavior of SQLit
2efc0 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  e: prior to.    
2efd0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33  ** version 3.8.3
2efe0 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b  , it never check
2eff0 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ed */.    rc = S
2f000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2f010 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2f020 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64  _OK && bHasMoved
2f030 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2f040 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2f050 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OVED;.  }.  retu
2f060 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2f070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f080 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2f090 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2f0a0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2f0b0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2f0c0 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2f0d0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2f0e0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2f0f0 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2f100 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2f110 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2f120 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2f130 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2f140 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2f150 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2f160 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f170 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2f180 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2f190 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2f1a0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2f1b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2f1c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2f1d0 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2f1e0 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2f1f0 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2f200 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2f210 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2f220 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2f230 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2f240 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2f250 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2f260 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2f270 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2f280 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2f290 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2f2a0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2f2b0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2f2c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2f2d0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2f2e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2f2f0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2f300 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2f310 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2f320 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2f330 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2f340 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2f350 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2f360 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2f370 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2f380 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2f390 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2f3a0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2f3b0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2f3c0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2f3d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2f3e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f3f0 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2f400 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2f410 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2f420 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2f430 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2f440 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2f450 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2f460 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2f470 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2f480 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2f490 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2f4a0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2f4b0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2f4c0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2f4d0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2f4e0 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2f4f0 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2f500 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2f510 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2f520 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2f530 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2f540 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2f550 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2f560 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2f570 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2f580 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2f590 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2f5a0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2f5b0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2f5c0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2f5d0 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2f5e0 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2f5f0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2f600 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2f610 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2f620 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2f630 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2f640 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2f650 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2f660 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2f670 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2f680 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2f690 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2f6a0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2f6b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2f6c0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2f6d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2f6e0 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2f6f0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2f700 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2f710 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2f720 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2f730 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2f740 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2f750 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2f760 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f770 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2f780 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2f790 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2f7a0 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2f7b0 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2f7c0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2f7d0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2f7e0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2f7f0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2f800 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2f810 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2f820 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2f830 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2f840 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2f850 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2f860 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2f870 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2f880 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2f890 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2f8a0 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2f8b0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2f8c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2f8d0 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2f8e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2f8f0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2f900 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2f910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f920 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2f930 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2f940 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f950 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2f960 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2f970 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2f980 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2f990 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2f9a0 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2f9b0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2f9c0 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2f9d0 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2f9e0 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2f9f0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2fa00 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2fa10 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2fa20 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2fa30 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2fa40 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2fa50 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2fa60 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2fa70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2fa80 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2fa90 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2faa0 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2fab0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2fac0 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2fad0 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2fae0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2faf0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2fb00 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2fb10 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2fb20 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2fb30 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2fb40 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2fb50 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2fb60 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2fb70 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2fb80 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2fb90 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2fba0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2fbb0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2fbc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fbd0 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2fbe0 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2fbf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fc00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2fc10 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2fc20 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2fc30 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2fc40 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2fc50 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2fc60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fc70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2fc80 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65  e database is ze
2fc90 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ro pages in size
2fca0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
2fcb0 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65  t either (1) the
2fcc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
2fcd0 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74  nal is a remnant
2fce0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61   from a prior da
2fcf0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
2fd00 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a  same name where.
2fd10 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
2fd20 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74  atabase file but
2fd30 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
2fd40 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72   was deleted, or
2fd50 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c   (2) the initial
2fd60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
2fd70 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70  saction that pop
2fd80 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74  ulates a new dat
2fd90 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72  abase is being r
2fda0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
2fdb0 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
2fdc0 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e   case, the journ
2fdd0 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64  al file can be d
2fde0 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72  eleted.  However
2fdf0 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20  , take care.    
2fe00 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65      ** not to de
2fe10 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2fe20 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61   file if it is a
2fe30 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20  lready open due 
2fe40 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  to.        ** jo
2fe50 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
2fe60 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ST..        */. 
2fe70 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
2fe80 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e  ==0 && !jrnlOpen
2fe90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2fea0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
2feb0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2fec0 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
2fed0 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
2fee0 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
2fef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ff00 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
2ff10 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
2ff20 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
2ff30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ff40 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
2ff50 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
2ff60 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2ff70 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2ff80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ff90 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2ffa0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2ffb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ffc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2ffd0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2ffe0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2fff0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
30000 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
30010 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
30020 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30030 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
30040 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
30050 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
30060 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
30070 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
30080 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
30090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
300a0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
300b0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
300c0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
300d0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
300e0 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
300f0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
30100 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
30110 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30120 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
30130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
30140 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
30150 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
30160 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30170 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
30180 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30190 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
301a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
301b0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
301c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
301d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
301e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
301f0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
30200 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
30210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
30220 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
30230 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
30240 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
30250 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30260 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
30270 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
30280 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30290 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
302a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
302b0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
302c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
302d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
302e0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
302f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30300 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
30310 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
30320 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
30330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
30340 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
30350 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
30360 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
30370 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
30380 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
30390 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
303a0 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
303b0 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
303c0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
303d0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
303e0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
303f0 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
30400 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
30410 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
30420 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
30430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
30440 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
30450 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
30460 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
30470 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
30480 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
30490 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
304a0 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
304b0 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
304c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
304d0 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
304e0 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
304f0 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
30500 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
30510 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
30520 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
30530 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
30540 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
30550 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30560 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
30570 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
30580 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
30590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
305a0 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
305b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
305c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
305d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
305e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
305f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
30600 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30610 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
30620 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
30630 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
30640 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
30650 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
30660 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
30670 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74  gerAcquire() unt
30680 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
30690 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
306a0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
306b0 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
306c0 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
306d0 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
306e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
306f0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
30700 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
30710 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
30720 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
30730 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
30740 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
30750 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
30760 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
30770 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  y in PAGER_OPEN 
30780 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
30790 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
307a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
307b0 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
307c0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
307d0 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
307e0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
307f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30800 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
30810 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
30820 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
30830 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
30840 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
30850 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
30860 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
30870 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
30880 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
30890 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
308a0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
308b0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
308c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
308d0 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
308e0 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
308f0 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
30900 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
30910 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30920 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
30930 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
30940 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
30950 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
30960 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
30970 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
30980 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
30990 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
309a0 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
309b0 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
309c0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
309d0 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
309e0 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
309f0 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
30a00 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
30a10 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
30a20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
30a30 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
30a40 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
30a50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30a60 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
30a70 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
30a80 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
30a90 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
30aa0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
30ab0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
30ac0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
30ad0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
30ae0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
30af0 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
30b00 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
30b10 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
30b20 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a  urnal file or .*
30b30 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  * rolling back a
30b40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
30b50 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
30b60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
30b70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
30b80 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
30b90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
30ba0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30bc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
30bd0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
30be0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
30bf0 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
30c00 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
30c10 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
30c20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
30c30 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73  es. This implies
30c40 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
30c50 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74  state should eit
30c60 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e  her.  ** be OPEN
30c70 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44   or READER. READ
30c80 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ER is only possi
30c90 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72  ble if the pager
30ca0 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20   is or was in . 
30cb0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
30cc0 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a  cess mode..  */.
30cd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30ce0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
30cf0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
30d00 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
30d10 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
30d20 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
30d30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30d40 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
30d50 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
30d60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
30d70 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  DER );.  if( NEV
30d80 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ER(MEMDB && pPag
30d90 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20  er->errCode) ){ 
30da0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
30db0 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28  rrCode; }..  if(
30dc0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
30dd0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
30de0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
30df0 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
30e00 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
30e10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
30e20 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
30e30 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
30e40 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
30e50 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20  rt( !MEMDB );.. 
30e60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
30e70 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
30e80 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
30e90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
30ea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30eb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30ec0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
30ed0 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
30ee0 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
30ef0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
30f00 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
30f10 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
30f20 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
30f30 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
30f40 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
30f50 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
30f60 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
30f70 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
30f80 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
30f90 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
30fa0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
30fb0 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  >eLock<=SHARED_L
30fc0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
30fd0 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
30fe0 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75  pPager, &bHotJou
30ff0 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rnal);.    }.   
31000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
31020 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
31030 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e     if( bHotJourn
31040 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
31050 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
31060 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
31070 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
31080 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
31090 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
310a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
310b0 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
310c0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
310d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
310e0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
310f0 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
31100 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
31110 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
31120 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
31130 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
31140 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
31150 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
31160 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
31170 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
31180 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
31190 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
311a0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
311b0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
311c0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
311d0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
311e0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
311f0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
31200 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
31210 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
31220 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
31230 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
31240 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
31250 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
31260 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
31270 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
31280 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
31290 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
312a0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
312b0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
312c0 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
312d0 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
312e0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
312f0 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
31300 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
31310 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
31320 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31330 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
31340 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    ** Unless the 
31350 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b  pager is in lock
31360 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
31370 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ve mode, the loc
31380 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  k is.      ** do
31390 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52  wngraded to SHAR
313a0 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74  ED_LOCK before t
313b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
313c0 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  urns..      */. 
313d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
313e0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
313f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
31400 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31420 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
31430 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
31440 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  * If it is not a
31450 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20  lready open and 
31460 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20  the file exists 
31470 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68  on disk, open th
31480 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
31490 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
314a0 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65  te access. Write
314b0 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69   access is requi
314c0 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20  red because .   
314d0 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69     ** in exclusi
314e0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
314f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
31500 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
31510 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  open .      ** a
31520 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  nd possibly used
31530 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
31540 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73  on later on. Als
31550 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20  o, write-access 
31560 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75  .      ** is usu
31570 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f  ally required to
31580 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
31590 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c  urnal in journal
315a0 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20  _mode=persist . 
315b0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e       ** mode (an
315c0 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e  d also for journ
315d0 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65  al_mode=truncate
315e0 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
315f0 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )..      **.    
31600 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    ** If the jour
31610 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
31620 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
31630 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
31640 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
31650 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
31660 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
31670 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
31680 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
31690 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
316a0 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
316b0 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
316c0 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a   Or, it .      *
316d0 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20  * may mean that 
316e0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
316f0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
31700 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20   when this.     
31710 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73   ** function was
31720 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20   called and the 
31730 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
31740 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
31750 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
31760 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
31770 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
31780 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
31790 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
317a0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20  r->pVfs;.       
317b0 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20   int bExists;   
317c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
317d0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
317e0 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
317f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31800 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
31810 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
31820 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
31830 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
31840 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a  STS, &bExists);.
31850 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31860 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78  SQLITE_OK && bEx
31870 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ists ){.        
31880 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
31890 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
318a0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
318b0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
318c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
318d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
318e0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
318f0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
31900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31910 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
31920 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
31930 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
31940 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
31950 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
31960 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
31970 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
31980 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
319a0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
319b0 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
319c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
319d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
319e0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  T;.            s
319f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
31a00 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
31a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31a20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  }.      }. .    
31a30 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
31a40 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
31a50 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
31a60 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
31a70 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
31a80 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
31a90 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
31aa0 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
31ab0 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
31ac0 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
31ad0 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
31ae0 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
31af0 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
31b00 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
31b10 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f  he.  Sync the ho
31b20 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t journal before
31b30 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a   playing.      *
31b40 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20  * it back since 
31b50 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
31b60 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66   crashed and lef
31b70 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  t the hot journa
31b80 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61  l.      ** proba
31b90 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63  bly did not sync
31ba0 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72   it and we are r
31bb0 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79  equired to alway
31bc0 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20  s sync.      ** 
31bd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
31be0 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  re playing it ba
31bf0 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
31c00 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
31c10 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
31c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
31c30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
31c40 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
31c50 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
31c60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
31c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31c80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31c90 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
31ca0 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
31cb0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
31cc0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
31cd0 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d  _OPEN;.        }
31ce0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
31cf0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
31d00 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
31d10 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62     pagerUnlockDb
31d20 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
31d30 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LOCK);.      }..
31d40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31d60 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
31d70 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e  h is taken if an
31d80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
31d90 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70  ile trying to op
31da0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  en.        ** or
31db0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74   roll back a hot
31dc0 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68  -journal while h
31dd0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
31de0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
31df0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75        ** pager_u
31e00 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  nlock() routine 
31e10 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62  will be called b
31e20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
31e30 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  to unlock.      
31e40 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49    ** the file. I
31e50 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74  f the unlock att
31e60 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  empt fails, then
31e70 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73   Pager.eLock mus
31e80 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
31e90 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
31ea0 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d  OCK (see the com
31eb0 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
31ec0 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20  define for .    
31ed0 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c      ** UNKNOWN_L
31ee0 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e  OCK above for an
31ef0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a   explanation). .
31f00 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31f10 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74     ** In order t
31f20 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f  o get pager_unlo
31f30 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c  ck() to do this,
31f40 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74   set Pager.eStat
31f50 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
31f60 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e  PAGER_ERROR now.
31f70 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
31f80 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73  ually counted as
31f90 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20   a transition.  
31fa0 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f        ** to ERRO
31fb0 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73  R state in the s
31fc0 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20  tate diagram at 
31fd0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
31fe0 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  file,.        **
31ff0 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
32000 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c  hat the same cal
32010 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
32020 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20  k() will very.  
32030 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79        ** shortly
32040 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20   transition the 
32050 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  pager object to 
32060 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
32070 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20  Calling.        
32080 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ** assert_pager_
32090 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61  state() would fa
320a0 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68  il now, as it sh
320b0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73  ould not be poss
320c0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ible.        ** 
320d0 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73  to be in ERROR s
320e0 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20  tate when there 
320f0 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e  are zero outstan
32100 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20  ding page .     
32110 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
32120 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32130 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
32140 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
32150 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32160 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
32170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32180 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32190 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73  OPEN );.      as
321a0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
321b0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
321c0 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  K).           ||
321d0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
321e0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
321f0 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  r->eLock>SHARED_
32200 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20  LOCK).      );. 
32210 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
32220 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32230 26 26 20 28 0a 20 20 20 20 20 20 20 20 70 50 61  && (.        pPa
32240 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 0a 20 20  ger->pBackup .  
32250 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61     || sqlite3Pca
32260 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
32270 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
32280 0a 20 20 20 20 20 7c 7c 20 55 53 45 46 45 54 43  .     || USEFETC
32290 48 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 29  H(pPager).    ))
322a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
322b0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
322c0 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
322d0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
322e0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
322f0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
32300 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
32310 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
32320 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
32330 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
32340 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
32350 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
32360 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
32370 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
32380 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
32390 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
323a0 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
323b0 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
323c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
323d0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
323e0 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
323f0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
32400 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
32410 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
32420 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
32430 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
32440 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
32450 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
32460 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
32470 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
32480 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
32490 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
324a0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
324b0 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
324c0 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
324d0 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
324e0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
324f0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
32500 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
32510 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
32520 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
32530 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
32540 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
32550 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
32560 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
32570 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
32580 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
32590 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
325a0 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
325b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
325c0 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
325d0 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
325e0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
325f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
32600 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
32610 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
32620 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
32630 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
32640 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
32650 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
32660 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
32670 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
32680 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
32690 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
326a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
326b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
326c0 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
326d0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
326e0 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
326f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
32710 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
32720 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
32730 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32740 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
32750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32760 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
32770 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
32780 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
32790 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
327a0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
327b0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
327c0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
327d0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
327e0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
327f0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  eset(pPager);.. 
32800 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20         /* Unmap 
32810 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32820 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  e. It is possibl
32830 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20  e that external 
32840 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20  processes.      
32850 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72    ** may have tr
32860 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61  uncated the data
32870 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
32880 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62  en extended it b
32890 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ack.        ** t
328a0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
328b0 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70  ize while this p
328c0 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68  rocess was not h
328d0 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20  olding a lock.. 
328e0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
328f0 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79  s case there may
32900 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70   exist a Pager.p
32910 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74  Map mapping that
32920 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20   appears.       
32930 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69   ** to be the ri
32940 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20  ght size but is 
32950 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c  not actually val
32960 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20  id. Avoid this. 
32970 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
32980 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69  ility by unmappi
32990 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20  ng the db here. 
329a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55  */.        if( U
329b0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
329c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
329d0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
329e0 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
329f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32a00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
32a10 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
32a20 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
32a30 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
32a40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
32a50 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
32a60 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
32a70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
32a80 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
32a90 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
32aa0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
32ab0 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
32ac0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
32ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
32ae0 61 67 65 72 2d 3e 6f 74 61 4d 6f 64 65 20 29 7b  ager->otaMode ){
32af0 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 61 6c 20  .      int nWal 
32b00 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
32b10 30 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b  0(pPager->zWal);
32b20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
32b30 57 61 6c 5b 6e 57 61 6c 2d 33 5d 20 3d 20 27 6f  Wal[nWal-3] = 'o
32b40 27 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ';.      rc = pa
32b50 67 65 72 4f 70 65 6e 57 61 6c 49 6e 74 65 72 6e  gerOpenWalIntern
32b60 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
32b70 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
32b80 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
32b90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32ba0 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
32bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
32bc0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
32bd0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
32be0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
32bf0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
32c00 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
32c10 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
32c20 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
32c30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32c40 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
32c50 3e 6f 74 61 4d 6f 64 65 3d 3d 31 20 29 7b 0a 20  >otaMode==1 ){. 
32c60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32c70 33 57 61 6c 43 68 65 63 6b 53 61 6c 74 28 70 50  3WalCheckSalt(pP
32c80 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67  ager->pWal, pPag
32c90 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69  er->fd);.      i
32ca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
32cc0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
32cd0 65 72 2d 3e 70 57 61 6c 2c 20 30 2c 20 30 2c 20  er->pWal, 0, 0, 
32ce0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  0);.        pPag
32cf0 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20  er->pWal = 0;.  
32d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32d10 20 20 20 70 50 61 67 65 72 2d 3e 6f 74 61 4d 6f     pPager->otaMo
32d20 64 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a  de = 2;.      }.
32d30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
32d40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32d50 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
32d60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32d70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
32d80 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
32d90 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
32da0 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
32db0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
32dd0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
32de0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
32df0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
32e00 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32e10 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
32e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
32e30 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
32e40 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d  AGER_READER;.  }
32e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32e60 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
32e70 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
32e80 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
32e90 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
32ea0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
32eb0 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
32ec0 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
32ed0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
32ee0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
32ef0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
32f00 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
32f10 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
32f20 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
32f30 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
32f40 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
32f50 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
32f60 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
32f70 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
32f80 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
32f90 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
32fa0 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
32fb0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
32fc0 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30  ger->nMmapOut==0
32fd0 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61 63   && (sqlite3Pcac
32fe0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
32ff0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
33000 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
33010 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
33020 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
33030 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
33040 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
33050 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
33060 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
33070 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
33080 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
33090 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
330a0 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
330b0 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
330c0 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
330d0 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
330e0 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
330f0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
33100 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
33110 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
33120 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
33130 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
33140 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
33150 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
33160 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
33170 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
33180 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
33190 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
331a0 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
331b0 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
331c0 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
331d0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
331e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
331f0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
33200 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
33210 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
33220 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
33230 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
33240 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
33250 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
33260 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
33270 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
33280 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
33290 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
332a0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
332b0 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
332c0 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
332d0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
332e0 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
332f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
33300 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
33310 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
33320 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
33330 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
33340 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
33350 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
33360 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
33370 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
33380 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
33390 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
333a0 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
333b0 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
333c0 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
333d0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
333e0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
333f0 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
33400 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
33410 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
33420 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
33430 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
33440 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
33450 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
33460 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
33470 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
33480 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
33490 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
334a0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
334b0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
334c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
334d0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
334e0 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
334f0 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
33500 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
33510 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
33520 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
33530 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
33540 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
33550 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
33560 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
33570 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
33580 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
33590 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
335a0 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
335b0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
335c0 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
335d0 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
335e0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
335f0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
33600 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
33610 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
33620 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20   zeroed instead 
33630 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  of.** being read
33640 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33650 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
33660 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
33670 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
33680 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
33690 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
336a0 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
336b0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
336c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
336d0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
336e0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
336f0 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
33700 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
33710 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
33720 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
33730 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
33740 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
33750 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
33760 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
33770 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
33780 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
33790 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
337a0 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
337b0 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
337c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
337d0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
337e0 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
337f0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
33800 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
33810 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
33820 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
33830 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
33840 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
33850 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
33860 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
33870 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
33880 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
33890 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
338a0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
338b0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
338c0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
338d0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
338e0 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
338f0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
33900 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
33910 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
33920 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
33930 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
33940 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
33950 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
33960 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
33970 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
33980 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
33990 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
339a0 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
339b0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
339c0 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
339d0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
339e0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
339f0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
33a00 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
33a10 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
33a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
33a30 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
33a40 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
33a50 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
33a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33a70 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
33a80 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
33a90 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
33aa0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
33ab0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
33ac0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
33ad0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
33ae0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
33af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
33b00 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
33b10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
33b20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
33b30 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
33b40 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b60 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
33b70 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
33b80 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
33b90 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67  oContent = (flag
33ba0 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  s & PAGER_GET_NO
33bb0 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20  CONTENT);..  /* 
33bc0 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c 65  It is acceptable
33bd0 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f   to use a read-o
33be0 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20  nly (mmap) page 
33bf0 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78 63  for any page exc
33c00 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20  ept.  ** page 1 
33c10 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  if there is no w
33c20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33c30 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51   open or the ACQ
33c40 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  UIRE_READONLY.  
33c50 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65 63  ** flag was spec
33c60 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  ified by the cal
33c70 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67  ler. And so long
33c80 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f   as the db is no
33c90 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  t a .  ** tempor
33ca0 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
33cb0 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
33cc0 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70   const int bMmap
33cd0 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26 26  Ok = (pgno!=1 &&
33ce0 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
33cf0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
33d00 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
33d10 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20  EADER || (flags 
33d20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  & PAGER_GET_READ
33d30 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66 20 53 51  ONLY)).#ifdef SQ
33d40 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
33d50 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f    && pPager->xCo
33d60 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  dec==0.#endif.  
33d70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
33d80 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
33d90 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
33da0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33db0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33dc0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
33dd0 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20  noContent==0 || 
33de0 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20  bMmapOk==0 );.. 
33df0 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
33e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33e10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33e20 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33e30 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
33e40 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
33e50 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
33e60 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
33e70 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
33e80 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
33e90 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
33ea0 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
33eb0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
33ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
33ed0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
33ee0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
33ef0 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
33f00 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
33f10 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
33f20 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
33f30 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
33f40 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
33f50 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
33f60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
33f70 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
33f80 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
33f90 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
33fa0 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   iFrame==0 ){.  
33fb0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
33fc0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  = 0;..      rc =
33fd0 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28   sqlite3OsFetch(
33fe0 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20  pPager->fd, .   
33ff0 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e         (i64)(pgn
34000 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
34010 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
34020 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74  >pageSize, &pDat
34030 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  a.      );..    
34040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34050 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a  _OK && pData ){.
34060 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
34070 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
34080 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20  _READER ){.     
34090 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
340a0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
340b0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
340c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
340d0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
340e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
340f0 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
34100 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44  pPager, pgno, pD
34110 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ata, &pPg);.    
34120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34130 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
34140 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
34150 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a  , (i64)(pgno-1)*
34160 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34170 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
34180 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34190 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pPg ){.         
341a0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
341b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
341c0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
341d0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  g;.          ret
341e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
341f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34200 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34220 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34230 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34240 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b    }.    }..    {
34250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70  .      sqlite3_p
34260 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73  cache_page *pBas
34270 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d  e;.      pBase =
34280 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34290 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
342a0 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20  che, pgno, 3);. 
342b0 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d       if( pBase==
342c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
342d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
342e0 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65  etchStress(pPage
342f0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
34300 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20  , &pBase);.     
34310 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34320 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
34330 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
34350 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c   = *ppPage = sql
34360 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
34370 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
34380 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61  Cache, pgno, pBa
34390 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
343a0 50 67 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  Pg==0 ) rc = SQL
343b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
343c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
343d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
343e0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
343f0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
34400 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
34410 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
34420 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
34430 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
34440 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
34450 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
34460 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
34470 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
34480 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
34490 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
344a0 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
344b0 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
344c0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
344d0 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
344e0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
344f0 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
34500 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
34510 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
34520 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
34530 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
34540 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
34550 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
34560 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
34570 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
34580 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
34590 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
345a0 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
345b0 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
345c0 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
345d0 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
345e0 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
345f0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
34600 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
34610 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
34620 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
34630 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
34640 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
34650 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
34660 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
34670 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
34680 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
34690 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
346a0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
346b0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
346c0 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a   */..    pPg = *
346d0 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
346e0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
346f0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
34700 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
34710 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
34720 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34730 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
34740 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
34750 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
34760 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
34770 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
34780 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
34790 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
347a0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
347b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
347c0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
347d0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
347e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
347f0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34800 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34810 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
34820 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
34830 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
34840 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
34850 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
34860 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
34870 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
34880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
34890 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
348a0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
348b0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
348c0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
348d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
348e0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
348f0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
34900 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
34910 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
34920 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
34930 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
34940 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
34950 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
34960 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
34970 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
34980 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
34990 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
349a0 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
349b0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
349c0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
349d0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
349e0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
349f0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
34a00 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
34a10 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
34a20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34a30 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
34a40 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
34a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
34a60 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
34a70 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
34a80 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
34a90 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
34aa0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
34ab0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
34ac0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
34ad0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
34ae0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34af0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
34b00 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
34b10 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
34b20 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
34b30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34b50 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
34b60 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
34b70 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
34b80 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
34b90 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
34ba0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
34bb0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
34bc0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
34bd0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
34be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
34bf0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
34c00 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f  Pager) && bMmapO
34c10 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
34c20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
34c30 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
34c40 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
34c50 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  rame);.        i
34c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34c70 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
34c80 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34c90 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
34ca0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
34cb0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
34cc0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
34cd0 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
34ce0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
34cf0 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d  bPage(pPg, iFram
34d00 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34d10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34d20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
34d30 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
34d50 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
34d60 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ash(pPg);.  }.. 
34d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34d80 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
34d90 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
34da0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34db0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
34dc0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
34dd0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
34de0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
34df0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
34e00 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
34e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34e20 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
34e30 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
34e40 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
34e50 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
34e60 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
34e70 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
34e80 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
34e90 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
34ea0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
34eb0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
34ec0 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  he. .**.** See a
34ed0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
34ee0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
34ef0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
34f00 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
34f10 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
34f20 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
34f30 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
34f40 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
34f50 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
34f60 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
34f70 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
34f80 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
34f90 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
34fa0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
34fb0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
34fc0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
34fd0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
34fe0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
34ff0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
35000 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
35010 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
35020 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gno){.  sqlite3_
35030 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61  pcache_page *pPa
35040 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
35050 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
35060 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
35070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35080 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
35090 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65    pPage = sqlite
350a0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
350b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
350c0 6e 6f 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  no, 0);.  return
350d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
350e0 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
350f0 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
35100 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pPage);.}../*.*
35110 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
35120 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
35130 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
35140 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
35150 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
35160 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
35170 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
35180 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
35190 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
351a0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
351b0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
351c0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
351d0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
351e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
351f0 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
35200 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
35210 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
35220 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67  Null(DbPage *pPg
35230 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
35240 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
35250 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  g!=0 );.  pPager
35260 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
35270 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
35280 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
35290 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61 73  .    pagerReleas
352a0 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20  eMapPage(pPg);. 
352b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
352c0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
352d0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
352e0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
352f0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64  (pPager);.}.void
35300 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35310 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
35320 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71 6c  .  if( pPg ) sql
35330 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
35340 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f  tNull(pPg);.}../
35350 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
35360 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
35370 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
35380 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
35390 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
353a0 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
353b0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
353c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
353d0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
353e0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
353f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
35400 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
35410 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
35420 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
35430 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
35440 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
35450 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
35460 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
35470 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
35480 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
35490 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
354a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
354b0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
354c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
354d0 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
354e0 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
354f0 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
35500 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
35510 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
35520 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
35530 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
35540 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
35550 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
35560 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35570 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
35580 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
35590 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
355a0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
355b0 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
355c0 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
355d0 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
355e0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
355f0 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
35600 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
35610 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
35620 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
35630 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
35640 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
35650 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
35660 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
35670 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
35680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
35690 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
356a0 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
356b0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
356c0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
356d0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
356e0 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
356f0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
35700 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
35710 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
35720 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
35730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35740 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
35750 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
35760 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
35770 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
35780 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
35790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
357b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
357c0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
357d0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
357e0 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
357f0 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
35800 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
35810 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35820 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
35830 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
35840 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35850 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35860 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35870 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
35880 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
35890 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
358a0 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
358b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
358c0 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
358d0 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
358e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
358f0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
35900 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
35910 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
35920 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
35930 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
35940 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
35950 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35960 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
35970 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
35980 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
35990 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
359a0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
359b0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
359c0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
359d0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
359e0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
359f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
35a00 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
35a10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35a20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
35a30 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
35a40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35a50 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
35a60 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
35a70 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
35a80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
35a90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
35aa0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
35ab0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
35ac0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
35ad0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
35ae0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
35af0 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
35b00 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
35b10 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35b30 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
35b40 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
35b50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  */.          SQL
35b60 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
35b70 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
35b80 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
35b90 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
35ba0 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
35bb0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
35bc0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
35bd0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
35be0 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
35bf0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
35c00 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
35c10 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20           );..   
35c20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
35c30 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
35c40 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73   still has the s
35c50 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64  ame name as it d
35c60 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  id when.        
35c70 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e  ** it was origin
35c80 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  ally opened. */.
35c90 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61 74          rc = dat
35ca0 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70  abaseIsUnmoved(p
35cb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
35cc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35cd0 4b 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  K ){.#ifdef SQLI
35ce0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
35cf0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20  _WRITE.         
35d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
35d10 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20  rnalOpen(.      
35d20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
35d30 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
35d40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
35d50 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
35d60 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
35d70 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
35d80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35d90 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
35da0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
35db0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
35dc0 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
35dd0 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  f.        }.    
35de0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
35df0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35e00 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
35e10 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a  ->jfd) );.    }.
35e20 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69    .  .    /* Wri
35e30 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
35e40 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
35e50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35e60 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a  and open .    **
35e70 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
35e80 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
35e90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
35ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35eb0 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
35ec0 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
35ed0 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
35ee0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
35ef0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
35f00 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
35f10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
35f20 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35f30 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
35f40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
35f50 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
35f60 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
35f70 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
35f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
35f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35fa0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
35fb0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
35fc0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
35fd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
35fe0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
35ff0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
36000 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36010 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
36020 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61  OCKED );.    pPa
36030 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
36040 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
36050 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MOD;.  }..  retu
36060 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36070 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
36080 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
36090 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
360a0 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
360b0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
360c0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
360d0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
360e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
360f0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
36100 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
36110 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
36120 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
36130 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
36140 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
36150 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
36160 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
36170 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
36180 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
36190 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
361a0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
361b0 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
361c0 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
361d0 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
361e0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
361f0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
36200 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
36210 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
36220 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
36230 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
36240 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
36250 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
36260 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
36270 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
36280 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
36290 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
362a0 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
362b0 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
362c0 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
362d0 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
362e0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
362f0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
36300 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
36310 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
36320 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
36330 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
36340 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
36350 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
36360 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
36370 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
36380 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
36390 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
363a0 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
363b0 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
363c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
363d0 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
363e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
363f0 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
36400 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
36410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36420 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
36430 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
36440 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
36450 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36460 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
36470 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
36480 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
36490 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65  ERROR );.  pPage
364a0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
364b0 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
364c0 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  ry;..  if( ALWAY
364d0 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  S(pPager->eState
364e0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20  ==PAGER_READER) 
364f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
36500 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36510 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  l==0 );..    if(
36520 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
36530 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
36540 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
36550 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
36560 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  se locking_mode=
36570 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61  exclusive, and a
36580 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75  n.      ** exclu
36590 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
365a0 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
365b0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
365c0 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20  btain it now..  
365d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
365e0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
365f0 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
36600 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
36610 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
36620 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
36630 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
36640 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
36650 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
36660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36680 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
366a0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
366b0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
366c0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
366d0 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
366e0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
366f0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
36700 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
36710 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
36720 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
36730 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
36740 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
36750 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
36760 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
36770 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
36780 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
36790 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
367a0 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
367b0 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
367c0 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
367d0 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
367e0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
367f0 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
36800 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36810 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
36820 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
36830 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
36840 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
36850 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
36860 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
36870 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
36880 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
36890 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
368a0 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
368b0 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
368c0 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
368d0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
368e0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
368f0 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
36900 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
36910 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
36920 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
36930 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
36940 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
36950 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
36960 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36970 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
36980 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
36990 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
369a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
369b0 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   && exFlag ){.  
369c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
369d0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
369e0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
369f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
36a00 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
36a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36a20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
36a30 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
36a40 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
36a50 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
36a60 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
36a70 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
36a80 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
36a90 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
36aa0 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
36ab0 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
36ac0 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
36ad0 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
36ae0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
36af0 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
36b00 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
36b10 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
36b20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
36b30 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
36b40 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
36b50 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
36b60 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
36b70 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
36b80 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
36b90 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
36ba0 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
36bb0 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
36bc0 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
36bd0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
36be0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
36bf0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
36c00 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
36c10 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
36c20 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
36c30 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
36c40 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
36c50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
36c60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
36c70 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
36c80 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
36c90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36ca0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
36cb0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
36cc0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
36cd0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36ce0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
36cf0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
36d00 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
36d10 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36d20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
36d30 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
36d40 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
36d50 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
36d60 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
36d70 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
36d80 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
36d90 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
36da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
36db0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61  a single data pa
36dc0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
36dd0 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
36de0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
36df0 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f  * main journal o
36e00 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73  r sub-journal as
36e10 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68   required. If th
36e20 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
36e30 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66  n into.** one of
36e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   the journals, t
36e50 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
36e60 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
36e70 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  he .** Pager.pIn
36e80 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61  Journal bitvec a
36e90 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
36ea0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
36eb0 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66  nt bitvecs.** of
36ec0 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f   any open savepo
36ed0 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69  ints as appropri
36ee0 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
36ef0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
36f00 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
36f10 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
36f20 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
36f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36f40 0a 20 20 69 6e 74 20 69 6e 4a 6f 75 72 6e 61 6c  .  int inJournal
36f50 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
36f60 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
36f70 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74  ed unless a writ
36f80 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
36f90 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20  s already .  ** 
36fa0 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68  been started. Th
36fb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
36fc0 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
36fd0 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
36fe0 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  int..  ** It is 
36ff0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
37000 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
37010 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
37020 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37030 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37040 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  KED.       || pP
37050 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37060 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37070 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
37080 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37090 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
370a0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
370b0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
370c0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
370d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
370e0 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  errCode==0 );.  
370f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37100 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a  readOnly==0 );..
37110 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
37120 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
37130 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
37140 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
37150 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
37160 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
37170 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
37180 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
37190 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
371a0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
371b0 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
371c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
371d0 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
371e0 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
371f0 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
37200 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
37210 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
37220 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
37230 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
37240 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
37250 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
37260 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
37270 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
37280 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
37290 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
372a0 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
372b0 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
372c0 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
372d0 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
372e0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
372f0 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
37300 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
37310 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
37320 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
37330 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37340 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
37350 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
37360 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
37370 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
37380 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37390 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
373a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
373b0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
373c0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
373d0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
373e0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
373f0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
37400 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
37410 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
37420 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
37430 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
37440 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
37450 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
37460 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
37470 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
37480 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
37490 0a 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 70  .  inJournal = p
374a0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61  ageInJournal(pPa
374b0 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 69 66 28  ger, pPg);.  if(
374c0 20 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70   inJournal && (p
374d0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
374e0 74 3d 3d 30 20 7c 7c 20 21 73 75 62 6a 52 65 71  t==0 || !subjReq
374f0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 29 20  uiresPage(pPg)) 
37500 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
37510 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37520 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  er) );.  }else{.
37530 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
37540 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
37550 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
37560 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
37570 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
37580 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
37590 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
375a0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
375b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
375c0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
375d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
375e0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
375f0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
37600 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
37610 21 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  !inJournal && !p
37620 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
37630 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
37640 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
37650 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
37660 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
37670 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
37680 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28  gSize && isOpen(
37690 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
376a0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
376b0 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
376c0 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20  *pData2;.       
376d0 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
376e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
376f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
37700 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
37710 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
37720 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
37730 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
37740 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
37750 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
37760 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
37770 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
37780 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
37790 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
377a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
377b0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
377c0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
377d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
377e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
377f0 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  <=pPager->journa
37800 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20  lOff );.        
37810 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
37820 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e  Pg->pData, pPg->
37830 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
37840 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
37850 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ata2);.        c
37860 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
37870 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
37880 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20  pData2);..      
37890 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
378a0 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
378b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
378c0 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
378d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
378e0 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
378f0 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65  bove, set the ne
37900 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72  ed-sync flag for
37910 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20   the page..     
37920 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
37930 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
37940 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
37950 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
37960 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c  in.        ** pl
37970 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
37980 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
37990 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
379a0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
379b0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
379c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
379d0 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72   And if an IO er
379e0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
379f0 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20   doing so,.     
37a00 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75     ** then corru
37a10 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77  ption may follow
37a20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
37a30 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
37a40 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
37a50 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  NC;..        rc 
37a60 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
37a70 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
37a80 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
37a90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37aa0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
37ab0 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
37ac0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
37ad0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
37ae0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
37af0 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a  eSize, iOff+4);.
37b00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
37b10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37b20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
37b30 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
37b40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
37b50 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f+pPager->pageSi
37b60 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  ze+4, cksum);.  
37b70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37b80 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37b90 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f   rc;..        IO
37ba0 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
37bb0 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
37bc0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
37bd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
37be0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
37bf0 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
37c00 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
37c10 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
37c20 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
37c30 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
37c40 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
37c50 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
37c60 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
37c70 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
37c80 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
37c90 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37ca0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
37cb0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
37cc0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
37cd0 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
37ce0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
37cf0 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
37d00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
37d10 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  8 + pPager->page
37d20 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50  Size;.        pP
37d30 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
37d40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
37d50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37d60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
37d70 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
37d80 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
37d90 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
37da0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
37db0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
37dc0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
37dd0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
37de0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
37df0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
37e00 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
37e10 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
37e20 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
37e30 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
37e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37e50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
37e60 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37e70 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
37e80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37e90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
37eb0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
37ec0 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
37ed0 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20  DBMOD ){.       
37ee0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
37ef0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
37f00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37f10 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
37f20 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
37f30 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
37f40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
37f50 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
37f60 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
37f80 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
37f90 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
37fa0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
37fb0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
37fc0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
37fd0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
37fe0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
37ff0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
38000 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
38010 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
38020 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
38030 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
38040 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
38050 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
38060 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
38070 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
38080 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
38090 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
380a0 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
380b0 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
380c0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
380d0 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
380e0 6f 69 6e 74 3e 30 20 26 26 20 73 75 62 6a 52 65  oint>0 && subjRe
380f0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
38100 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
38110 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
38120 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
38130 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
38140 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
38150 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
38160 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
38170 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
38180 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
38190 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
381a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
381b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
381c0 20 61 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71   a variant of sq
381d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
381e0 29 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  ) that runs when
381f0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
38200 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
38210 61 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  an the page size
38220 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20  .  SQLite makes 
38230 74 68 65 20 28 72 65 61 73 6f 6e 61 62 6c 65 29  the (reasonable)
38240 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74   assumption that
38250 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20 6f 66  .** all bytes of
38260 20 61 20 73 65 63 74 6f 72 20 61 72 65 20 77 72   a sector are wr
38270 69 74 74 65 6e 20 74 6f 67 65 74 68 65 72 20 62  itten together b
38280 79 20 68 61 72 64 77 61 72 65 2e 20 20 48 65 6e  y hardware.  Hen
38290 63 65 2c 20 61 6c 6c 20 62 79 74 65 73 20 6f 66  ce, all bytes of
382a0 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e 65 65  .** a sector nee
382b0 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 6c  d to be journall
382c0 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20 61 20  ed in case of a 
382d0 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20 74 68  power loss in th
382e0 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61  e middle of.** a
382f0 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73   write..**.** Us
38300 75 61 6c 6c 79 2c 20 74 68 65 20 73 65 63 74 6f  ually, the secto
38310 72 20 73 69 7a 65 20 69 73 20 6c 65 73 73 20 74  r size is less t
38320 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
38330 74 68 65 20 70 61 67 65 20 73 69 7a 65 2c 20 69  the page size, i
38340 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61 73 65 20  n which.** case 
38350 70 61 67 65 73 20 63 61 6e 20 62 65 20 69 6e 64  pages can be ind
38360 69 76 69 64 75 61 6c 6c 79 20 77 72 69 74 74 65  ividually writte
38370 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
38380 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e 20 74 68   only runs in th
38390 65 20 65 78 63 65 70 74 69 6f 6e 61 6c 0a 2a 2a  e exceptional.**
383a0 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
383b0 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 6d 61  page size is sma
383c0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ller than the se
383d0 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  ctor size..*/.st
383e0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
383f0 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 57 72  LINE int pagerWr
38400 69 74 65 4c 61 72 67 65 53 65 63 74 6f 72 28 50  iteLargeSector(P
38410 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
38420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
38430 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
38440 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
38450 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
38460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
38470 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
38480 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
38490 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
384a0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
384b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
384c0 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
384d0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
384e0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
384f0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b    int nPage = 0;
38500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38510 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
38520 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
38530 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
38540 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
38550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38560 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
38570 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  er */.  int need
38580 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
38590 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
385a0 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
385b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
385c0 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  /.  Pager *pPage
385d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
385e0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
385f0 74 68 61 74 20 6f 77 6e 73 20 70 50 67 20 2a 2f  that owns pPg */
38600 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
38610 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
38620 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
38630 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
38640 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f  .  /* Set the do
38650 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
38660 62 69 74 20 74 6f 20 31 2e 20 54 68 69 73 20 69  bit to 1. This i
38670 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
38680 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 2a 2a 20 61  not allow.  ** a
38690 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
386a0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
386b0 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
386c0 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 2a  journaled by.  *
386d0 2a 20 74 68 69 73 2