/ Hex Artifact Content
Login

Artifact 067ae23d7a370eea6bd529848331c63879570adc:


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 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e 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 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 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: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 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 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 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 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, 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 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
71b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
71c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
71d0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
71e0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
71f0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
7200: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
7210: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
7220: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
7230: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7240: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7250: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7260: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7270: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7290: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
72a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
72b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
72c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7300: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7310: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7320: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7330: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7340: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7350: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
7360: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
7370: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
7380: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
7390: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
73a0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
73b0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
73c0: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
73d0: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
73e0: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
73f0: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7400: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7410: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7420: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7430: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7440: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7450: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
7460: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
7470: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
7480: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
7490: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
74a0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
74b0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
74c0: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
74d0: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
74e0: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
74f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7500: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7510: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7520: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7530: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7550: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
7560: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
7570: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
7580: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
7590: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
75a0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
75b0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
75c0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
75d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
75e0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
75f0: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7600: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7610: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7620: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7630: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7640: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7650: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
7660: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20  doNotSyncSpill; 
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
7680: 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68  ot do a spill th
7690: 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c  at requires jrnl
76a0: 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75   sync */.  u8 su
76b0: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
76c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
76d0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
76e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
76f0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7710: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7720: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7730: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7740: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7750: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7760: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7770: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7780: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
77a0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
77b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
77c0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
77d0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
77e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
77f0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7800: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7810: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7830: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7840: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7880: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7890: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
78a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
78b0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
78c0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
78d0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
78e0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
78f0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7910: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7920: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7930: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7940: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7950: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7960: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7970: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7980: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7990: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
79a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
79b0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
79c0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
79d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79e0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
79f0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a00: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7a10: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7a20: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7a30: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a40: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7a50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7a60: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7a70: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7a80: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7a90: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7aa0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7ab0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7ac0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7ad0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7af0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7b00: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7b10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7b20: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7b30: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7b40: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7b50: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7b60: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7b70: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7b80: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7bb0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7bc0: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7bd0: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7be0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7bf0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7c00: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7c10: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7c20: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7c30: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7c40: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
7c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c90: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
7ca0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
7cb0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
7cc0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
7cd0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
7ce0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
7cf0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
7d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7d10: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
7d20: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
7d30: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
7d40: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7d50: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
7d60: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
7d70: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
7d80: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
7d90: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
7da0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
7db0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
7dc0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7de0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7df0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
7e00: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7e20: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
7e30: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
7e40: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
7e50: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
7e60: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
7e70: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
7e80: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
7e90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
7ea0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
7eb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7ec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7ed0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
7ee0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
7ef0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
7f00: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7f10: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
7f20: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
7f30: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
7f40: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
7f50: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
7f60: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
7f70: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
7f80: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
7f90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7fa0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
7fb0: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
7fc0: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
7fd0: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
7fe0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
7ff0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
8000: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
8010: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
8020: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8030: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8040: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8050: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8060: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8070: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8080: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8090: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
80a0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
80b0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
80c0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
80d0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
80e0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
80f0: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8100: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8110: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8120: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8130: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8150: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8160: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8170: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
81a0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
81b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
81c0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
81d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
81e0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
81f0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8200: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8210: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8220: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8230: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8240: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8260: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8280: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8290: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
82a0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
82b0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
82e0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
82f0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8300: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8310: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8320: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8330: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8340: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8350: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8360: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8370: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8380: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8390: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
83a0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
83b0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
83c0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
83d0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
83e0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
83f0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8400: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8410: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8420: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8430: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8460: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8470: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8490: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
84a0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
84b0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
84c0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
84d0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
84e0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
84f0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8500: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8510: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8520: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8530: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8540: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8550: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8560: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8570: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8580: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8590: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
85a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
85b0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
85c0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
85d0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
85e0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
85f0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8610: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8620: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8630: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8640: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8650: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8660: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8670: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8680: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8690: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
86b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
86c0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
86d0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
86e0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
86f0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8700: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8710: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8720: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8730: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8740: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8750: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8760: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8770: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8780: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8790: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
87a0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
87b0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
87c0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
87d0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
87e0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
87f0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8800: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8810: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8820: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8830: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8840: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8850: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8860: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8870: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8880: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8890: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
88a0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
88b0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
88c0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
88d0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
88e0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
88f0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
8900: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
8910: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
8920: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
8930: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
8940: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
8950: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8960: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8970: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8980: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8990: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
89a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
89b0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
89c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
89d0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
89e0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
89f0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8a00: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8a10: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8a20: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8a30: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8a40: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8a50: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8a60: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8a70: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8a80: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8a90: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8aa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8ab0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8ac0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8ae0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8af0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8b00: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8b10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8b20: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8b30: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8b40: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8b50: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8b60: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8b70: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8b80: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8b90: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8ba0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8bb0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8bc0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8bd0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8be0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8bf0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8c00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8c10: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8c20: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8c30: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8c40: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8c50: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8c60: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8c70: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8c80: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8c90: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8ca0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8cb0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8cc0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8ce0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8cf0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8d00: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8d10: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8d20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8d30: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8d40: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8d50: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8d60: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8d70: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8d80: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8d90: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8da0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8db0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8dc0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8dd0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8de0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8df0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8e00: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8e10: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8e20: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8e30: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8e40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8e50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8e60: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8e70: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8e80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8e90: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8ea0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8eb0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8ec0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8ed0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8ee0: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8ef0: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8f00: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8f10: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8f20: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8f30: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8f40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8f50: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
8f60: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
8f70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8f80: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
8f90: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
8fa0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
8fb0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
8fc0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
8fd0: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
8fe0: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
8ff0: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
9000: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9010: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
9020: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
9030: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
9040: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
9050: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
9060: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
9070: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
9080: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9090: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
90a0: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
90b0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
90c0: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
90d0: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
90e0: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
90f0: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
9100: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
9110: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
9120: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
9130: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
9140: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
9150: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9160: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
9170: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
9180: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9190: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
91a0: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
91b0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
91c0: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
91d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
91e0: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
91f0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9200: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9210: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9240: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9260: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
9270: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9280: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9290: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
92a0: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
92b0: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
92c0: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
92d0: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
92e0: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
92f0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
9300: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9310: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
9320: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
9330: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
9340: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
9350: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9360: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
9370: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
9380: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9390: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
93a0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
93b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
93c0: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
93d0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
93e0: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
93f0: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
9400: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
9410: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9420: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
9430: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
9440: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
9450: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
9460: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
9470: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
9480: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9490: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
94a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
94b0: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
94c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
94d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
94e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
94f0: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
9500: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
9510: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
9520: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
9530: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
9540: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
9550: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
9560: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
9570: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
9580: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9590: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
95a0: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
95b0: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
95c0: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
95d0: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
95e0: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
95f0: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
9600: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
9610: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9620: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
9630: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
9640: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9650: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
9660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9670: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
9680: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9690: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
96a0: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
96b0: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
96c0: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
96d0: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
96e0: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
96f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9700: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9710: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9720: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9730: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
9740: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9750: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9760: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9770: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
9780: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
9790: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
97a0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
97b0: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
97c0: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
97d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
97e0: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
97f0: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
9800: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
9810: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
9820: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
9830: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
9850: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
9860: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
9870: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9890: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
98a0: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
98b0: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
98c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
98d0: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
98e0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
98f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9900: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9910: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9920: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
9930: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
9940: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
9950: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
9960: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
9970: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9980: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
9990: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
99a0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
99b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
99c0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
99d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
99f0: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
9a00: 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64  OCK || p->noRead
9a10: 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72  lock );.      br
9a20: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9a30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9a40: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
9a50: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9a60: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9a70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9a80: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9a90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9aa0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ab0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9ac0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ad0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9ae0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9b00: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
9b10: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
9b20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b30: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b40: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
9b50: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
9b60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
9b70: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
9b80: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
9b90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ba0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9bb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
9bc0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9bd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9be0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
9bf0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9c00: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9c10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9c20: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9c30: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9c40: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9c50: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9c60: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
9c70: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
9c80: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
9c90: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
9ca0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
9cb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
9cc0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
9cd0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
9ce0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
9cf0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
9d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
9d10: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
9d20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
9d30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
9d40: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
9d50: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9d60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9d70: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d80: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
9d90: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9da0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9db0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9dc0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9dd0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9de0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9df0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e10: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
9e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9e40: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9e50: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
9e60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e70: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9e80: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
9e90: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
9ea0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9eb0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9ec0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9ed0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9ee0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9ef0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f00: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f10: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f20: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
9f30: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
9f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9f50: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
9f60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
9f70: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9f80: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9f90: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9fa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9fb0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9fc0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9fd0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9fe0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
9ff0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a000: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a010: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a020: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a040: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a050: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a060: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a070: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a080: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a090: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a0b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a0c0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a0d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a0e0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a0f0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a100: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a110: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a120: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a130: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a140: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a150: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a160: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a170: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a180: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a190: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a1a0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a1b0: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a1c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a1d0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a1e0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a1f0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a200: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a210: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a220: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a230: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a240: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a250: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a260: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a270: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a280: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a290: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a2a0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a2b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a2c0: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a2d0: 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
a2e0: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
a2f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
a300: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a310: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a320: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a330: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a340: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a350: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a360: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a370: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a380: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a390: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a3a0: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a3b0: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
a3c0: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
a3d0: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
a3e0: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
a3f0: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
a400: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
a410: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a420: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
a430: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
a440: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
a450: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
a460: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
a470: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
a480: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
a490: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
a4a0: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
a4b0: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
a4c0: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
a4d0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
a4e0: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
a4f0: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
a500: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
a510: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
a520: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
a530: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
a540: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
a550: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
a560: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
a570: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
a580: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
a590: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
a5a0: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
a5b0: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
a5c0: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
a5d0: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
a5e0: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
a5f0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
a600: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
a610: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
a620: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
a630: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
a640: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a650: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
a660: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
a670: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
a680: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a690: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
a6a0: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
a6b0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a6c0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
a6d0: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
a6e0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
a6f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a700: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a710: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
a720: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
a730: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a740: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a750: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
a760: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
a770: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a780: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
a790: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
a7a0: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
a7b0: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
a7c0: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
a7d0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
a7e0: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
a7f0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a800: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
a810: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
a820: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a830: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a840: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
a850: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
a860: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
a870: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
a880: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a890: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
a8a0: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
a8b0: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
a8c0: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
a8d0: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
a8e0: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
a8f0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
a900: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a910: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a920: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
a930: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
a940: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a950: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
a960: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
a970: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a980: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a990: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
a9a0: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
a9b0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a9c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a9d0: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
a9e0: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
a9f0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aa00: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aa10: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
aa20: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
aa30: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aa40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aa50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
aa60: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
aa70: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
aa80: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
aa90: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
aaa0: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
aab0: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
aac0: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
aad0: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
aae0: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
aaf0: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
ab00: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
ab10: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
ab20: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
ab30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
ab40: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
ab50: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
ab60: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
ab70: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
ab80: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
ab90: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
aba0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
abb0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
abc0: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
abd0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
abe0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
abf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
ac00: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
ac10: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
ac20: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
ac30: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
ac40: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
ac50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
ac60: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
ac70: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
ac80: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
ac90: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
aca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
acb0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
acc0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
acd0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
ace0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
acf0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
ad00: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
ad10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
ad20: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ad30: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
ad40: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
ad50: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ad60: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
ad70: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
ad80: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
ad90: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
ada0: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
adb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
adc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
add0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
ade0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
adf0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
ae00: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
ae10: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
ae20: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
ae30: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
ae40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
ae50: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
ae60: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
ae70: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
ae80: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
ae90: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
aea0: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
aeb0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
aec0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
aed0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
aee0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
aef0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
af00: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
af10: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
af20: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
af30: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
af40: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
af50: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
af60: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
af70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
af80: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
af90: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
afa0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
afb0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
afc0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
afd0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
afe0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
aff0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
b000: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
b010: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
b020: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
b030: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
b040: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b050: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b060: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b070: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
b080: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
b090: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
b0a0: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
b0b0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
b0c0: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
b0d0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b0e0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b0f0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
b100: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
b110: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
b120: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
b130: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b140: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b150: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
b160: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
b170: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
b180: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
b190: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
b1a0: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
b1b0: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
b1c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
b1d0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
b1e0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
b1f0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
b200: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b210: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b220: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b230: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
b240: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
b250: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
b260: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
b270: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
b280: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
b290: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
b2a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
b2b0: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
b2c0: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
b2d0: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
b2e0: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
b2f0: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
b300: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
b310: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
b320: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
b330: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
b340: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b350: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
b360: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
b370: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
b380: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b390: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
b3a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b3b0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b3c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b3d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
b3e0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
b3f0: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
b400: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
b410: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
b420: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
b430: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
b440: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b450: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
b460: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
b470: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
b480: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
b490: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b4a0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
b4b0: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
b4c0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
b4d0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
b4e0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
b4f0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
b500: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
b510: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
b520: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
b530: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
b540: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
b550: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
b560: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
b580: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b590: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b5a0: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b5b0: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
b5c0: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
b5d0: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
b5e0: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
b5f0: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
b600: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
b610: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
b620: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
b630: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
b640: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
b650: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
b660: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
b670: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
b680: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
b690: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
b6a0: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
b6b0: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
b6c0: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
b6d0: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
b6e0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b6f0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b700: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
b710: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
b720: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
b730: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b740: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
b750: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b760: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b770: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b780: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
b790: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b7a0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
b7b0: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
b7c0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
b7d0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
b7e0: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
b7f0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
b800: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  CK ){.    rc = s
b810: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
b820: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
b830: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b840: 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65  ITE_OK && (pPage
b850: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
b860: 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45  N_LOCK||eLock==E
b870: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29  XCLUSIVE_LOCK) )
b880: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
b890: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
b8a0: 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
b8b0: 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
b8c0: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
b8d0: 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
b8e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b8f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b900: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
b910: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
b920: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
b930: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
b940: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
b950: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
b960: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
b970: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
b980: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
b990: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
b9a0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
b9b0: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
b9c0: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
b9d0: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
b9e0: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
b9f0: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
ba00: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
ba10: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
ba20: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
ba30: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
ba40: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
ba50: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   size..**.** The
ba60: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
ba70: 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61   also always ena
ba80: 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  bled for tempora
ba90: 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a  ry files. It is.
baa0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  ** an error to c
bab0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
bac0: 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f  n if pPager is o
bad0: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d  pened on an in-m
bae0: 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
baf0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
bb00: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
bb10: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
bb20: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
bb30: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
bb40: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
bb50: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
bb60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
bb70: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
bb80: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
bb90: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
bba0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
bbb0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
bbc0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
bbd0: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
bbe0: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
bbf0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bc00: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
bc10: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  B );.  if( !pPag
bc20: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
bc30: 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20      int dc;     
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
bc60: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
bc70: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74  */.    int nSect
bc80: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
bc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
bca0: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69  or size */.    i
bcb0: 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20  nt szPage;      
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
bce0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
bcf0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
bd00: 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   );.    dc = sql
bd10: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
bd20: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
bd30: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65  er->fd);.    nSe
bd40: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
bd50: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
bd60: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
bd70: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
bd80: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
bd90: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
bda0: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
bdb0: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
bdc0: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
bdd0: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
bde0: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
bdf0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
be00: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
be10: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
be20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
be30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
be40: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
be50: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
be60: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
be70: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
be80: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
be90: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
bea0: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
beb0: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
bec0: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
bed0: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
bee0: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
bef0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
bf00: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
bf10: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
bf20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
bf30: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
bf40: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
bf50: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
bf60: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
bf70: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
bf80: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
bf90: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
bfa0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
bfb0: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
bfc0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
bfd0: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
bfe0: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
bff0: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c000: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c010: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c020: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c030: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c040: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c050: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c060: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c070: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c080: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c090: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c0a0: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c0b0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c0c0: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c0d0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c0e0: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c100: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c110: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c120: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c130: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c140: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c150: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c160: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c170: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c180: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c190: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c1a0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c1b0: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c1c0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c1d0: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c1e0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c1f0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c200: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c210: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c220: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c230: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c240: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c250: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c260: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c270: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c280: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c290: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c2a0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
c2b0: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
c2c0: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
c2d0: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
c2e0: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
c2f0: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
c300: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c310: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
c320: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
c330: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
c340: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
c350: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
c360: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
c370: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
c380: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
c390: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
c3a0: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
c3b0: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
c3c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c3d0: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
c3e0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
c3f0: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
c400: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
c410: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
c420: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
c430: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
c440: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
c450: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
c460: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
c470: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
c480: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c490: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
c4a0: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
c4b0: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
c4c0: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
c4d0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
c4e0: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
c4f0: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
c500: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
c510: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
c520: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
c530: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
c540: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
c550: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
c560: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
c570: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c580: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
c590: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
c5a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
c5b0: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
c5c0: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
c5d0: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
c5e0: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
c5f0: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
c600: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
c610: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
c620: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
c630: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
c640: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
c650: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c660: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
c670: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c680: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
c690: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
c6a0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
c6b0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
c6c0: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
c6d0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
c6e0: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
c6f0: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
c700: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
c710: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
c720: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
c730: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
c740: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
c750: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c760: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
c770: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
c780: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
c790: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
c7a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
c7b0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
c7c0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
c7d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
c7e0: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
c7f0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
c800: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
c810: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
c820: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
c830: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
c840: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
c850: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
c880: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
c8b0: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
c8c0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
c8d0: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c8f0: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
c900: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
c910: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
c920: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
c930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
c940: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
c950: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
c960: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
c990: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
c9a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
c9b0: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
c9c0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
c9d0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
c9e0: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
c9f0: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
ca00: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
ca10: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
ca20: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
ca30: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
ca40: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
ca50: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
ca60: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
ca70: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
ca80: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51  Master .   || SQ
ca90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
caa0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
cab0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
cac0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
cad0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cae0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
caf0: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
cb00: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
cb10: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
cb20: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
cb30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
cb40: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
cb50: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
cb60: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
cb70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
cb80: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
cb90: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
cba0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
cbb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
cbc0: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
cbd0: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
cbe0: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
cbf0: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
cc00: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
cc10: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
cc20: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
cc30: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
cc40: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
cc50: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
cc60: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
cc70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
cc80: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
cc90: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
cca0: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
ccb0: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
ccc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ccd0: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
cce0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
ccf0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
cd00: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
cd10: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
cd20: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
cd30: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
cd40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cd50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
cd60: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
cd70: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
cd80: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
cd90: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
cda0: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
cdb0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
cdc0: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
cdd0: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
cde0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
cdf0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
ce00: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
ce10: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
ce20: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
ce30: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
ce40: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce70: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
cec0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
ced0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
cee0: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
cf00: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
cf10: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
cf20: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
cf30: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
cf40: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
cf50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cf60: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
cf70: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
cf80: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
cf90: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
cfa0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
cfb0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
cfc0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
cfd0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
cfe0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
cff0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d000: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d010: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d020: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d030: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d050: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d060: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d070: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d080: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d090: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d0a0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d0b0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d0c0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d0d0: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d0e0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d0f0: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d100: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d110: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d120: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d130: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d140: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d150: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d160: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d170: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d180: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d190: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d1a0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d1b0: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d1c0: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d1d0: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d1e0: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d1f0: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d200: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d210: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d220: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d230: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d240: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d250: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d260: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d270: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d280: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d290: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d2a0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d2b0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d2c0: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d2d0: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d2e0: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d2f0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d300: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d310: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d320: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d330: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d340: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d350: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d360: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d370: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d380: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d390: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d3a0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d3b0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d3c0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d3d0: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d3e0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
d3f0: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
d400: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
d410: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
d420: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
d430: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
d440: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
d450: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
d460: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
d470: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d4a0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
d4b0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
d4c0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
d4d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d4e0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
d4f0: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
d500: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
d510: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
d520: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
d530: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
d540: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
d550: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
d560: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
d570: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
d580: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d590: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
d5a0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
d5b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
d5c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
d5d0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
d5e0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
d5f0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
d600: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
d610: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
d620: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
d630: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d640: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
d650: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
d660: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
d670: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
d680: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
d690: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
d6a0: 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
d6b0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
d6c0: 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61  point the transa
d6d0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
d6e0: 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65  ed but the write
d6f0: 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73   lock .    ** is
d700: 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
d710: 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
d720: 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69  e is a size limi
d730: 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  t configured for
d740: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72   .    ** the per
d750: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
d760: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
d770: 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63  file currently c
d780: 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20  onsumes more.   
d790: 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74   ** space than t
d7a0: 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73  hat limit allows
d7b0: 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69   for, truncate i
d7c0: 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20  t now. There is 
d7d0: 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  no need.    ** t
d7e0: 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20  o sync the file 
d7f0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
d800: 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
d810: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d820: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74  ITE_OK && iLimit
d830: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  >0 ){.      i64 
d840: 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  sz;.      rc = s
d850: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d860: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
d870: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  z);.      if( rc
d880: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
d890: 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  z>iLimit ){.    
d8a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d8b0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d8c0: 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b  r->jfd, iLimit);
d8d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d8e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d8f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d900: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d910: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d920: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d930: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ed. A journal.**
d940: 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c   header (JOURNAL
d950: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
d960: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
d970: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d980: 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  at the.** curren
d990: 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t location..**.*
d9a0: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72  * The format for
d9b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
d9c0: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
d9d0: 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a  s:.** - 8 bytes:
d9e0: 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69   Magic identifyi
d9f0: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ng journal forma
da00: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
da10: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
da20: 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f  ds in journal, o
da30: 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  r -1 no-sync mod
da40: 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20  e is on..** - 4 
da50: 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75  bytes: Random nu
da60: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61  mber used for pa
da70: 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20  ge hash..** - 4 
da80: 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
da90: 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
daa0: 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  nt..** - 4 bytes
dab0: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73  : Sector size us
dac0: 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73  ed by the proces
dad0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69  s that wrote thi
dae0: 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20  s journal..** - 
daf0: 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73  4 bytes: Databas
db00: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
db10: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
db20: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
db30: 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75  - 28) bytes of u
db40: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
db50: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
db60: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
db70: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
db80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
dbb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64  */.  char *zHead
dbc0: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
dbd0: 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70  pSpace;  /* Temp
dbe0: 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64  orary space used
dbf0: 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72   to build header
dc00: 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65   */.  u32 nHeade
dc10: 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  r = (u32)pPager-
dc20: 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a  >pageSize;/* Siz
dc30: 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e  e of buffer poin
dc40: 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65  ted to by zHeade
dc50: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74  r */.  u32 nWrit
dc60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dc70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
dc80: 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65  tes of header se
dc90: 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ctor written */.
dca0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
dcd0: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
dce0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
dcf0: 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20  r->jfd) );      
dd00: 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  /* Journal file 
dd10: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f  must be open. */
dd20: 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e  ..  if( nHeader>
dd30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
dd40: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48  Pager) ){.    nH
dd50: 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f  eader = JOURNAL_
dd60: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
dd70: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
dd80: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
dd90: 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79  vepoints and any
dda0: 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72   of them were cr
ddb0: 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63  eated .  ** sinc
ddc0: 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
ddd0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
dde0: 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70   was written, up
ddf0: 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  date the .  ** P
de00: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
de10: 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20  drOffset fields 
de20: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  now..  */.  for(
de30: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
de40: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
de50: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  +){.    if( pPag
de60: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
de70: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30  i].iHdrOffset==0
de80: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
de90: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
dea0: 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50  .iHdrOffset = pP
deb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
dec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
ded0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
dee0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
def0: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
df00: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
df10: 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57  );..  /* .  ** W
df20: 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69  rite the nRec Fi
df30: 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72  eld - the number
df40: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
df50: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69   that follow thi
df60: 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  s.  ** journal h
df70: 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  eader. Normally,
df80: 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e   zero is written
df90: 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61   to this value a
dfa0: 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a  t this time..  *
dfb0: 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f  * After the reco
dfc0: 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  rds are added to
dfd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e   the journal (an
dfe0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79  d the journal sy
dff0: 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69  nced, .  ** if i
e000: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
e010: 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f  ), the zero is o
e020: 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
e030: 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a  the true number.
e040: 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20    ** of records 
e050: 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  (see syncJournal
e060: 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ())..  **.  ** A
e070: 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74   faster alternat
e080: 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20  ive is to write 
e090: 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68  0xFFFFFFFF to th
e0a0: 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68  e nRec field. Wh
e0b0: 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  en.  ** reading 
e0c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73  the journal this
e0d0: 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c   value tells SQL
e0e0: 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68  ite to assume th
e0f0: 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74  at the.  ** rest
e100: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e110: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61  file contains va
e120: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
e130: 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f  . This assumptio
e140: 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72  n.  ** is danger
e150: 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69  ous, as if a fai
e160: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
e170: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
e180: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
e190: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
e1a0: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
e1b0: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
e1c0: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
e1d0: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
e1e0: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
e1f0: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
e200: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
e210: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
e220: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
e230: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
e240: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
e250: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
e260: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
e270: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e280: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
e290: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
e2a0: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
e2b0: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
e2c0: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
e2d0: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
e2e0: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
e2f0: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
e300: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
e310: 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
e320: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a  ager->noSync );.
e330: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
e340: 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d  Sync || (pPager-
e350: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
e360: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
e370: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
e380: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
e390: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
e3a0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
e3b0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e3c0: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65  ND) .  ){.    me
e3d0: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
e3e0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
e3f0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e400: 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69  c));.    put32bi
e410: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e420: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e430: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
e440: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
e450: 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c  mset(zHeader, 0,
e460: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
e470: 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a  Magic)+4);.  }..
e480: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
e490: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
e4a0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
e4b0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
e4c0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
e4d0: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
e4e0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
e4f0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e500: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e510: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
e520: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e530: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
e540: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
e550: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
e560: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e570: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e580: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
e590: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
e5a0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
e5b0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
e5c0: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
e5d0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e5e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e5f0: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
e600: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
e610: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
e620: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
e630: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e640: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e650: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
e660: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
e670: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
e680: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
e690: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
e6a0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
e6b0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
e6c0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
e6d0: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
e6e0: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
e6f0: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
e700: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
e710: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
e720: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
e730: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
e740: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
e750: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
e760: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
e770: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e780: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
e790: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
e7a0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
e7b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
e7c0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
e7d0: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
e7e0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
e7f0: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
e800: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
e810: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
e820: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
e830: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
e840: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
e850: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
e860: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
e870: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
e880: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
e890: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
e8a0: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
e8b0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
e8c0: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
e8d0: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
e8e0: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
e8f0: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
e900: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
e910: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
e920: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
e930: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
e940: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
e950: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
e960: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
e970: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
e980: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
e990: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
e9a0: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
e9b0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
e9c0: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
e9d0: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
e9e0: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
e9f0: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
ea00: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
ea10: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
ea20: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
ea30: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
ea40: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
ea50: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
ea60: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
ea70: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
ea80: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
ea90: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
eaa0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
eab0: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
eac0: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
ead0: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
eae0: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
eaf0: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
eb00: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
eb10: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
eb20: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
eb30: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
eb40: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
eb50: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
eb60: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
eb70: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
eb80: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
eb90: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
eba0: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
ebb0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
ebc0: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
ebd0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
ebe0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
ebf0: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
ec00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
ec10: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
ec20: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
ec30: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
ec40: 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  lOff);.    asser
ec50: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
ec60: 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
ec70: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
ec80: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ec90: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
eca0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
ecb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
ecc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
ecd0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
ece0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
ecf0: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
ed00: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
ed10: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
ed20: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
ed30: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
ed40: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
ed50: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
ed60: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
ed70: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
ed80: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
ed90: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
eda0: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
edb0: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
edc0: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
edd0: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
ede0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
edf0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ee00: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
ee10: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
ee20: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
ee30: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
ee40: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
ee50: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
ee60: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
ee70: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
ee80: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
ee90: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
eea0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
eeb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
eec0: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
eed0: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
eee0: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
eef0: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
ef00: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
ef10: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
ef20: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
ef30: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
ef40: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
ef50: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
ef60: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
ef70: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
ef80: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
ef90: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
efa0: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
efb0: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
efc0: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
efd0: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
efe0: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
eff0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f000: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
f010: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
f020: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
f030: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
f040: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
f050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
f060: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
f070: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
f080: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
f090: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f0a0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
f0b0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
f0c0: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
f0d0: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
f0e0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
f0f0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
f100: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
f110: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f130: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
f140: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
f150: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
f160: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
f190: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
f1a0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
f1b0: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
f1c0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
f1d0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
f1e0: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
f1f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f200: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
f210: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
f220: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
f230: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
f240: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
f250: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
f260: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
f270: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
f280: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
f290: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
f2a0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
f2b0: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
f2c0: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
f2d0: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
f2e0: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
f2f0: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
f300: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
f310: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
f320: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f330: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
f340: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
f350: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
f360: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
f370: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
f380: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
f390: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f3a0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
f3b0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
f3c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
f3d0: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
f3e0: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
f3f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f400: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
f410: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
f420: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
f430: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
f440: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
f450: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
f460: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
f470: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
f480: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
f490: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
f4a0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
f4b0: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
f4c0: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
f4d0: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
f4e0: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
f4f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
f500: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
f510: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
f520: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
f530: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
f540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f550: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
f560: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
f570: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
f580: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
f590: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f5a0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
f5b0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
f5c0: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
f5d0: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
f5e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
f5f0: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
f600: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
f610: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
f620: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
f630: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
f640: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
f650: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
f660: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
f670: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
f680: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
f690: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
f6a0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f6b0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f6c0: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
f6d0: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
f6e0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
f6f0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
f700: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
f710: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
f720: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
f730: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
f740: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
f750: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
f760: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
f770: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f780: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
f790: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
f7a0: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
f7b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
f7c0: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
f7d0: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
f7e0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
f7f0: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
f800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f810: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
f820: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
f830: 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  er */..    /* Re
f840: 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ad the page-size
f850: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
f860: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f870: 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69  fields. */.    i
f880: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
f890: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f8a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f8b0: 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72  Off+20, &iSector
f8c0: 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53  Size)).     || S
f8d0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f8e0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
f8f0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
f900: 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29  24, &iPageSize))
f910: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
f920: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
f930: 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20      /* Versions 
f940: 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
f950: 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65  to 3.5.8 set the
f960: 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   page-size field
f970: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   of the.    ** j
f980: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
f990: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
f9a0: 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ase, assume that
f9b0: 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53   the Pager.pageS
f9c0: 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ize.    ** varia
f9d0: 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ble is already s
f9e0: 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  et to the correc
f9f0: 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20  t page size..   
fa00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
fa10: 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eSize==0 ){.    
fa20: 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50    iPageSize = pP
fa30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
fa40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
fa50: 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
fa60: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
fa70: 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
fa80: 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  sector-size fiel
fa90: 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69  ds.    ** are wi
faa0: 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62  thin range. To b
fab0: 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f  e 'in range', bo
fac0: 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74  th values need t
fad0: 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20  o be a power.   
fae0: 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74   ** of two great
faf0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
fb00: 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61   to 512 or 32, a
fb10: 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74  nd not greater t
fb20: 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a  han their .    *
fb30: 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d  * respective com
fb40: 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75  pile time maximu
fb50: 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f  m limits..    */
fb60: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
fb70: 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20  ze<512          
fb80: 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74          || iSect
fb90: 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c  orSize<32.     |
fba0: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
fbb0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
fbc0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
fbd0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
fbe0: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
fbf0: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
fc00: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
fc10: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
fc20: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
fc30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
fc40: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
fc50: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
fc60: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
fc70: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
fc80: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
fc90: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
fca0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
fcb0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
fcc0: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
fcd0: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
fce0: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
fcf0: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
fd00: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
fd10: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
fd20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
fd30: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
fd40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fd50: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
fd60: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
fd70: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
fd80: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
fd90: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
fda0: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
fdb0: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
fdc0: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
fdd0: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
fde0: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
fdf0: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
fe00: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
fe10: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
fe20: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
fe30: 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
fe40: 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20  er, &iPageSize, 
fe50: 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
fe60: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
fe70: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
fe80: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
fe90: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
fea0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
feb0: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
fec0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
fed0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
fee0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
fef0: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
ff00: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
ff10: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
ff20: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
ff30: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
ff40: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
ff50: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
ff60: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
ff70: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
ff80: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
ff90: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
ffa0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
ffb0: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
ffc0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
ffd0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
ffe0: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
fff0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
10000 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
10010 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
10020 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
10030 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
10040 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
10050 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10060 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
10070 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
10080 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
10090 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
100a0 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
100b0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
100c0 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
100d0 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
100e0 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
100f0 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
10100 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
10110 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
10120 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
10130 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
10140 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
10150 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
10160 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
10170 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
10180 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
10190 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
101a0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
101b0 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
101c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
101d0 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
101e0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
101f0 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
10200 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10210 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
10220 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
10230 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
10240 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10250 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
10260 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
10270 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
10280 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
10290 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
102a0 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
102b0 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
102c0 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
102d0 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
102e0 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
102f0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
10300 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
10310 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
10320 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
10330 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
10340 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
10350 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
10360 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
10370 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
10380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
10390 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
103a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
103b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
103c0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
103f0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
10400 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10420 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
10430 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
10440 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10460 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
10470 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
10480 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
10490 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
104a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
104b0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
104c0 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
104d0 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
104f0 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
10500 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
10510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10520 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20  r->setMaster==0 
10530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
10540 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
10550 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61  ) );..  if( !zMa
10560 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67  ster .   || pPag
10570 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
10580 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
10590 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c  DE_MEMORY .   ||
105a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
105b0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
105c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29  NALMODE_OFF .  )
105d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
105e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
105f0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
10600 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 1;.  assert( i
10610 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
10620 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
10630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
10640 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
10650 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f  urnalOff );..  /
10660 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  * Calculate the 
10670 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  length in bytes 
10680 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
10690 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20   of zMaster */. 
106a0 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20   for(nMaster=0; 
106b0 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
106c0 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20  ; nMaster++){.  
106d0 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74    cksum += zMast
106e0 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d  er[nMaster];.  }
106f0 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
10700 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
10710 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
10720 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
10730 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
10740 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10750 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
10760 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
10770 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
10780 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
10790 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
107a0 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
107b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
107c0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
107d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
107e0 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
107f0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
10800 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  );.  }.  iHdrOff
10810 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
10820 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69  alOff;..  /* Wri
10830 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
10840 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68  urnal data to th
10850 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
10860 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20  rnal file. If.  
10870 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
10880 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  rs, return the e
10890 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
108a0 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20   caller..  */.  
108b0 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20  if( (0 != (rc = 
108c0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
108d0 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
108e0 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
108f0 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c  pPager)))).   ||
10900 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10910 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10920 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
10930 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f  , nMaster, iHdrO
10940 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30  ff+4))).   || (0
10950 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10960 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10970 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10980 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29  ster, nMaster)))
10990 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
109a0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
109b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
109c0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c  Off+4+nMaster+4,
109d0 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20   cksum))).   || 
109e0 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
109f0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
10a00 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
10a10 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66  Magic, 8, iHdrOf
10a20 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29  f+4+nMaster+8)))
10a30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
10a40 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65   rc;.  }.  pPage
10a50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10a60 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a   (nMaster+20);..
10a70 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
10a80 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e  r is in peristen
10a90 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20  t-journal mode, 
10aa0 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61  then the physica
10ab0 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  l .  ** journal-
10ac0 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20  file may extend 
10ad0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
10ae0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10af0 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  al name.  ** and
10b00 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69   8 bytes of magi
10b10 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74  c data just writ
10b20 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ten to the file.
10b30 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64   This is .  ** d
10b40 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65  angerous because
10b50 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
10b60 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72  lback a hot-jour
10b70 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69  nal file.  ** wi
10b80 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
10b90 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65  o find the maste
10ba0 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74  r-journal name t
10bb0 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
10bc0 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
10bd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
10be0 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hot. .  **.  ** 
10bf0 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f  Easiest thing to
10c00 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e   do in this scen
10c10 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63  ario is to trunc
10c20 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
10c30 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68  .  ** file to th
10c40 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  e required size.
10c50 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c  .  */ .  if( SQL
10c60 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
10c70 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10c80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72  pPager->jfd, &jr
10c90 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a  nlSize)).   && j
10ca0 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e  rnlSize>pPager->
10cb0 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a  journalOff.  ){.
10cc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10cd0 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
10ce0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
10cf0 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d  journalOff);.  }
10d00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10d10 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
10d20 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
10d30 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
10d40 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75  age number. Retu
10d50 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
10d60 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
10d70 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65  ULL if the reque
10d80 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
10d90 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
10da0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
10db0 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
10dc0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
10dd0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
10de0 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
10e10 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74  alue */..  /* It
10e20 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
10e30 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50   for a call to P
10e40 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74  cacheFetch() wit
10e50 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20  h createFlag==0 
10e60 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69  to.  ** fail, si
10e70 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74  nce no attempt t
10e80 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d  o allocate dynam
10e90 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ic memory will b
10ea0 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28  e made..  */.  (
10eb0 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63  void)sqlite3Pcac
10ec0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
10ed0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
10ee0 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  , &p);.  return 
10ef0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  p;.}../*.** Disc
10f00 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
10f10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
10f20 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
10f30 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
10f40 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
10f50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
10f60 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
10f70 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
10f80 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74  Backup);.  sqlit
10f90 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
10fa0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
10fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
10fc0 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
10fd0 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
10fe0 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64  oint[] array and
10ff0 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67   set both.** Pag
11000 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e  er.aSavepoint an
11010 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69  d Pager.nSavepoi
11020 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73  nt to zero. Clos
11030 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  e the sub-journa
11040 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70  l.** if it is op
11050 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  en and the pager
11060 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11070 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74  sive mode..*/.st
11080 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
11090 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50  eAllSavepoints(P
110a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
110b0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
110c0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
110d0 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  or for looping t
110e0 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61  hrough Pager.aSa
110f0 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72  vepoint */.  for
11100 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
11110 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
11120 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
11130 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
11140 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11150 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
11160 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  t);.  }.  if( !p
11170 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11180 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49  Mode || sqlite3I
11190 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
111a0 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
111b0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
111c0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
111d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
111e0 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  e(pPager->aSavep
111f0 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d  oint);.  pPager-
11200 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >aSavepoint = 0;
11210 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  .  pPager->nSave
11220 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
11230 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
11240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11250 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
11260 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
11270 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
11280 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63  point .** bitvec
11290 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61  s of all open sa
112a0 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e  vepoints. Return
112b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
112c0 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53  ccessful.** or S
112d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
112e0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
112f0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
11300 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70  c int addToSavep
11310 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65  ointBitvecs(Page
11320 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
11330 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  pgno){.  int ii;
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11360 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
11370 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
11380 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11390 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b   */..  for(ii=0;
113a0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
113b0 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
113c0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
113d0 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
113e0 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a  aSavepoint[ii];.
113f0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d      if( pgno<=p-
11400 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >nOrig ){.      
11410 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74  rc |= sqlite3Bit
11420 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76  vecSet(p->pInSav
11430 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  epoint, pgno);. 
11440 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11450 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11460 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
11480 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
11490 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
114a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
114b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
114c0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
114d0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
114e0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
114f0 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74   and not.** in t
11500 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
11510 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73 77  Otherwise, it sw
11520 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72  itches the pager
11530 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a   to PAGER_OPEN.*
11540 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49  * state..**.** I
11550 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
11560 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ot in exclusive-
11570 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65  access mode, the
11580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11590 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20  s.** completely 
115a0 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65  unlocked. If the
115b0 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
115c0 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73  d and the file-s
115d0 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f  ystem does.** no
115e0 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55 4e  t exhibit the UN
115f0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
11600 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68  PEN property, th
11610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
11620 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20  s.** closed (if 
11630 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a  it is open)..**.
11640 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
11650 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  is in ERROR stat
11660 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
11670 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
11680 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
11690 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
116a0 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64 65  che are discarde
116b0 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68 69  d before switchi
116c0 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74  ng back to .** t
116d0 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52  he OPEN state. R
116e0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
116f0 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20 69  ther the pager i
11700 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  s in exclusive-m
11710 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61  ode.** or not, a
11720 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ny journal file 
11730 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
11740 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20  -system will be 
11750 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20  treated.** as a 
11760 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
11770 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
11780 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61 64  next time a read
11790 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
117a0 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68  is opened (by th
117b0 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68  is or by any oth
117c0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a  er connection)..
117d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
117e0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
117f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61  r *pPager){..  a
11800 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11810 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
11820 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  DER .       || p
11830 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11840 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20  AGER_OPEN .     
11850 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11860 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
11870 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65   .  );..  sqlite
11880 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11890 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
118a0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
118b0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
118c0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
118d0 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20  ints(pPager);.. 
118e0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
118f0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
11900 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
11910 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
11920 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e      sqlite3WalEn
11930 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
11940 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
11950 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
11960 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
11970 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50  .  }else if( !pP
11980 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
11990 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
119a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
119b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
119c0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20  r code returned 
119d0 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  by pagerUnlockDb
119e0 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44  () */.    int iD
119f0 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65  c = isOpen(pPage
11a00 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73  r->fd)?sqlite3Os
11a10 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
11a20 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
11a30 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ):0;..    /* If 
11a40 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
11a50 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c  stem support del
11a60 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69  etion of open fi
11a70 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  les, then.    **
11a80 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
11a90 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
11aa0 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
11ab0 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77  se lock.  Otherw
11ac0 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68  ise.    ** anoth
11ad0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
11ae0 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
11af0 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c  delete might del
11b00 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20  ete the file.   
11b10 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64   ** out from und
11b20 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
11b30 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11b40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
11b50 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ORY   & 5)!=1 );
11b60 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11b70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11b80 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d 31  OFF      & 5)!=1
11b90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11ba0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11bb0 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29  DE_WAL      & 5)
11bc0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11bd0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11be0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26  LMODE_DELETE   &
11bf0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11c00 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11c10 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
11c20 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20  E & 5)==1 );.   
11c30 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11c40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
11c50 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a  IST  & 5)==1 );.
11c60 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20      if( 0==(iDc 
11c70 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  & SQLITE_IOCAP_U
11c80 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11c90 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21  OPEN).     || 1!
11ca0 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  =(pPager->journa
11cb0 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29  lMode & 5).    )
11cc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
11cd0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
11ce0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
11cf0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
11d00 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  is in the ERROR 
11d10 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63 61  state and the ca
11d20 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ll to unlock the
11d30 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
11d40 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74   file fails, set
11d50 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
11d60 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  k to UNKNOWN_LOC
11d70 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  K. See the comme
11d80 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  nt.    ** above 
11d90 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
11da0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
11db0 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
11dc0 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20 20  of why this.    
11dd0 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  ** is necessary.
11de0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
11df0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
11e00 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  Pager, NO_LOCK);
11e10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11e20 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
11e30 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11e40 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  ERROR ){.      p
11e50 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55  Pager->eLock = U
11e60 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20  NKNOWN_LOCK;.   
11e70 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   }..    /* The p
11e80 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20 62  ager state may b
11e90 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50  e changed from P
11ea0 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41  AGER_ERROR to PA
11eb0 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20  GER_OPEN here.  
11ec0 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65    ** without cle
11ed0 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  aring the error 
11ee0 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e  code. This is in
11ef0 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20  tentional - the 
11f00 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64  error.    ** cod
11f10 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64  e is cleared and
11f20 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74   the cache reset
11f30 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65   in the block be
11f40 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
11f50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11f60 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65  errCode || pPage
11f70 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
11f80 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50  _ERROR );.    pP
11f90 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
11fa0 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  tDone = 0;.    p
11fb0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
11fc0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a  PAGER_OPEN;.  }.
11fd0 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65  .  /* If Pager.e
11fe0 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74  rrCode is set, t
11ff0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12000 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63  he pager cache c
12010 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72  annot be.  ** tr
12020 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
12030 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
12040 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
12050 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
12060 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61  ,.  ** it can sa
12070 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74  fely move back t
12080 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  o PAGER_OPEN sta
12090 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  te. This happens
120a0 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f   in both.  ** no
120b0 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69  rmal and exclusi
120c0 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e  ve-locking mode.
120d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
120e0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
120f0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
12100 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  B );.    pager_r
12110 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
12120 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
12130 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
12140 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
12150 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12160 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12170 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12180 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
12190 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
121a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
121b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
121c0 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
121d0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
121e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
121f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12200 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12210 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12220 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12230 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
12240 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
12250 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12260 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
12270 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
12280 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
12290 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
122a0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
122b0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
122c0 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
122d0 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
122e0 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
122f0 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12300 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12310 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12320 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12330 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
12340 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
12350 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12360 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
12370 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
12380 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
12390 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
123a0 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
123b0 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
123c0 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
123d0 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
123e0 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
123f0 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12400 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12410 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12420 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12430 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
12440 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
12450 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
12460 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
12470 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
12480 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
12490 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
124a0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
124b0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
124c0 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
124d0 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
124e0 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
124f0 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12500 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12510 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12520 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12530 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12540 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12550 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12560 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12570 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12580 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12590 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
125a0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
125b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
125c0 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
125d0 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
125e0 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
125f0 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12610 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12620 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12630 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12640 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
12650 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
12660 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12670 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
12680 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
12690 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
126a0 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
126b0 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
126c0 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
126d0 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
126e0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
126f0 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
12700 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12710 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12720 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
12730 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12740 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
12750 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12760 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12770 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
12780 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
12790 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
127a0 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
127b0 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
127c0 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
127d0 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
127e0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
127f0 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
12800 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
12810 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
12820 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
12830 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
12840 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
12850 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
12860 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
12870 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
12880 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
12890 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
128a0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
128b0 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
128c0 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
128d0 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
128e0 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
128f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
12900 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
12910 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
12920 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
12930 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
12940 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
12950 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
12960 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
12970 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
12980 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
12990 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
129a0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
129b0 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
129c0 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
129d0 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
129e0 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
129f0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
12a00 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
12a10 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
12a20 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
12a30 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
12a40 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
12a50 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
12a60 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
12a70 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12a80 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
12a90 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
12aa0 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
12ab0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
12ac0 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
12ad0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
12ae0 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
12af0 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
12b00 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
12b10 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
12b20 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
12b30 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
12b40 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
12b50 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
12b60 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
12b70 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
12b80 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
12b90 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
12ba0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
12bb0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
12bc0 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
12bd0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
12be0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
12bf0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
12c00 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
12c10 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
12c20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
12c30 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
12c40 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
12c50 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
12c60 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
12c70 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
12c80 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
12c90 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
12ca0 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
12cb0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
12cc0 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
12cd0 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
12ce0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
12cf0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12d00 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
12d10 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
12d20 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
12d30 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
12d40 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
12d50 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
12d60 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
12d70 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
12d80 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
12d90 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
12da0 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
12db0 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
12dc0 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
12dd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
12de0 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
12df0 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
12e00 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
12e10 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
12e20 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
12e30 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
12e40 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
12e50 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
12e60 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
12e70 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
12e80 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
12e90 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
12ea0 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
12eb0 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
12ec0 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
12ed0 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
12ee0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
12ef0 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
12f00 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
12f10 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
12f20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
12f30 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
12f40 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
12f50 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
12f60 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
12f70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
12f80 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
12f90 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
12fa0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
12fb0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
12fc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
12fd0 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
12fe0 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
12ff0 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
13000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13010 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
13020 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
13030 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
13040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13050 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
13060 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
13070 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
13080 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
13090 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
130a0 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
130b0 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
130c0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
130d0 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
130e0 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
130f0 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
13100 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
13110 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
13120 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
13130 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13140 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  hasMaster){.  in
13150 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13160 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  ;      /* Error 
13170 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  code from journa
13180 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
13190 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
131a0 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
131b0 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  K;     /* Error 
131c0 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c  code from db fil
131d0 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  e unlock operati
131e0 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e  on */..  /* Do n
131f0 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61  othing if the pa
13200 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
13210 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
13220 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
13230 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52   or at least a R
13240 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68  ESERVED lock. Th
13250 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
13260 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
13270 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
13280 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13290 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52  n active but a R
132a0 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
132b0 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20  er lock is.  ** 
132c0 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63  held under two c
132d0 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20  ircumstances:.  
132e0 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74  **.  **   1. Aft
132f0 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  er a successful 
13300 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
13310 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c  back, it is call
13320 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20  ed with.  **    
13330 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f    eState==PAGER_
13340 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d  NONE and eLock==
13350 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
13360 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49    **.  **   2. I
13370 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  f a connection w
13380 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ith locking_mode
13390 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69  =exclusive holdi
133a0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
133b0 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20  .  **      lock 
133c0 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f  switches back to
133d0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f   locking_mode=no
133e0 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78  rmal and then ex
133f0 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20  ecutes a.  **   
13400 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74     read-transact
13410 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ion, this functi
13420 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  on is called wit
13430 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  h eState==PAGER_
13440 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20  READER .  **    
13450 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43    and eLock==EXC
13460 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e  LUSIVE_LOCK when
13470 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
13480 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
13490 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
134a0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
134b0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
134c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
134d0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
134e0 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ROR );.  if( pPa
134f0 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
13500 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
13510 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
13520 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  <RESERVED_LOCK )
13530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13540 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
13550 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
13560 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61  nts(pPager);.  a
13570 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
13580 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
13590 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
135a0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
135b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
135c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
135d0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
135e0 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
135f0 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
13600 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
13610 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d    if( sqlite3IsM
13620 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
13630 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
13640 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13650 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13660 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
13670 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73  EMORY );.      s
13680 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13690 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
136a0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
136b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
136c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
136d0 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
136e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
136f0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
13700 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13710 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65  ITE_OK;.      }e
13720 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13730 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
13740 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
13750 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13760 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13770 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
13780 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
13790 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
137a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
137b0 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c  PERSIST.      ||
137c0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
137d0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
137e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
137f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13800 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20  E_WAL).    ){.  
13810 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75      rc = zeroJou
13820 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
13830 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  hasMaster);.    
13840 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13850 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
13860 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
13870 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
13880 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
13890 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
138a0 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
138b0 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
138c0 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
138d0 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
138e0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
138f0 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
13900 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
13910 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
13920 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
13930 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
13940 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
13950 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
13960 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
13970 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
13980 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
13990 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
139a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
139b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
139c0 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
139d0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
139e0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
139f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
13a00 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
13a10 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13a20 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13a30 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
13a40 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
13a50 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13a60 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
13a70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
13a80 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
13a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13aa0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
13ab0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
13ac0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
13ad0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
13ae0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
13af0 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
13b00 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
13b10 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
13b20 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
13b30 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
13b40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
13b50 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
13b60 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
13b70 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
13b80 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
13b90 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
13ba0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
13bb0 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
13bc0 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
13bd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
13be0 6e 72 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20  nref(p);.    }. 
13bf0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
13c00 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
13c10 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
13c20 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
13c30 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
13c40 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
13c50 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
13c60 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
13c70 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
13c80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
13c90 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
13ca0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
13cb0 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  dbSize);..  if( 
13cc0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13cd0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
13ce0 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
13cf0 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
13d00 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
13d10 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
13d20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
13d30 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
13d40 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
13d50 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
13d60 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
13d70 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
13d80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
13d90 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
13da0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
13db0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
13dc0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
13dd0 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
13de0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
13df0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
13e00 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
13e10 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
13e20 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
13e30 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
13e40 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
13e50 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
13e60 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
13e70 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
13e80 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
13e90 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
13ea0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
13eb0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
13ec0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
13ed0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
13ee0 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
13ef0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
13f00 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
13f10 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
13f20 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
13f30 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
13f40 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
13f50 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
13f60 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
13f70 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
13f80 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
13f90 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
13fa0 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
13fb0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
13fc0 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
13fd0 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
13fe0 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
13ff0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14000 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
14010 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
14020 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
14030 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14040 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14050 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14060 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14070 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14080 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14090 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
140a0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
140b0 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
140c0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
140d0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
140e0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
140f0 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14100 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14110 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14120 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14130 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14140 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14150 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14160 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14170 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14180 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14190 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
141a0 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
141b0 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
141c0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
141d0 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
141e0 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
141f0 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14200 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14210 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14220 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14230 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14240 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14250 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14260 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14270 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14280 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14290 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
142a0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
142b0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
142c0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
142d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
142e0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
142f0 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
14300 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
14310 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
14320 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
14330 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14340 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
14350 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14360 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
14370 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14380 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
14390 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
143a0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
143b0 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
143c0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
143d0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
143e0 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  }.  }.  pager_un
143f0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
14400 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
14410 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e   aData must poin
14420 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
14430 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
14440 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
14450 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  ta. Compute and 
14460 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
14470 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20  m based ont the 
14480 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
14490 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61  .** page of data
144a0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
144b0 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72   value of pPager
144c0 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a  ->cksumInit..**.
144d0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
144e0 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
144f0 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
14500 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
14510 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
14520 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65  ial value (pPage
14530 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e  r->cksumInit) an
14540 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79  d every 200th by
14550 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  te.** of the pag
14560 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67  e data, starting
14570 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65   with byte offse
14580 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t (pPager->pageS
14590 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63  ize%200)..** Eac
145a0 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
145b0 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69  reted as an 8-bi
145c0 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  t unsigned integ
145d0 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69  er..**.** Changi
145e0 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75  ng the formula u
145f0 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
14600 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73  his checksum res
14610 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ults in an.** in
14620 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e  compatible journ
14630 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  al file format..
14640 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c  **.** If journal
14650 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
14660 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
14670 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
14680 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73  ost likely .** s
14690 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20  cenario is that 
146a0 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
146b0 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
146c0 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
146d0 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75  ed. .** It is mu
146e0 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
146f0 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
14700 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
14710 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
14720 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
14730 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
14740 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
14750 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
14760 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
14770 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
14780 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
14790 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
147a0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
147b0 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
147c0 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
147d0 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
147e0 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
147f0 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
14800 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
14810 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c   /* Checksum val
14820 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
14830 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
14840 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20  ->pageSize-200; 
14850 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14860 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68   counter */.  wh
14870 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
14880 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
14890 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
148a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
148b0 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
148c0 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
148d0 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e   page size and n
148e0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
148f0 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20  d bytes back.** 
14900 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f  to the codec..*/
14910 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
14920 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20  AS_CODEC.static 
14930 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74  void pagerReport
14940 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
14950 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14960 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
14970 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  g ){.    pPager-
14980 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28  >xCodecSizeChng(
14990 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20  pPager->pCodec, 
149a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
149b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
149d0 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  t)pPager->nReser
149e0 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ve);.  }.}.#else
149f0 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52  .# define pagerR
14a00 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20  eportSize(X)    
14a10 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20   /* No-op if we 
14a20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
14a30 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66   codec */.#endif
14a40 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
14a50 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
14a60 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
14a70 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
14a80 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
14a90 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
14aa0 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
14ab0 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
14ac0 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
14ad0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
14ae0 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
14af0 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
14b00 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73  file. The *pOffs
14b10 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69  et.** value is i
14b20 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
14b30 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
14b40 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  t page in the jo
14b50 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
14b60 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
14b70 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63  ournal uses chec
14b80 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
14b90 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
14ba0 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a  es .** not..**.*
14bb0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
14bc0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
14bd0 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f   record read fro
14be0 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
14bf0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  nal file.** is g
14c00 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
14c10 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
14c20 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
14c30 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a  hen playback is.
14c40 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53  ** skipped and S
14c50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14c60 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rned..**.** If p
14c70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Done is not NULL
14c80 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  , then it is a r
14c90 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74  ecord of pages t
14ca0 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  hat have already
14cb0 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20  .** been played 
14cc0 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61  back.  If the pa
14cd0 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68  ge at *pOffset h
14ce0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
14cf0 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28  played back.** (
14d00 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
14d10 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69  ding pDone bit i
14d20 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70  s set) then skip
14d30 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a   the playback..*
14d40 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14d50 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73  pDone bit corres
14d60 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a  ponding to the *
14d70 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20  pOffset page is 
14d80 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  set.** prior to 
14d90 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
14da0 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63   If the page rec
14db0 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75  ord is successfu
14dc0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
14dd0 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
14de0 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79  file.** and play
14df0 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51  ed back, then SQ
14e00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
14e10 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
14e20 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68  ror occurs.** wh
14e30 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  ile reading the 
14e40 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
14e50 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14e60 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74  le or while writ
14e70 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ing.** to the da
14e80 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
14e90 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
14ea0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
14eb0 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73   If data.** is s
14ec0 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
14ed0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
14ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74  journal file but
14ef0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a   appears to be.*
14f00 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  * corrupted, SQL
14f10 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
14f20 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f  rned. Data is co
14f30 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74  nsidered corrupt
14f40 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72  ed in.** two cir
14f50 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a  cumstances:.** .
14f60 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
14f70 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72  cord page-number
14f80 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f   is illegal (0 o
14f90 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29  r PAGER_MJ_PGNO)
14fa0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74  , or.**   * If t
14fb0 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69  he record is bei
14fc0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66  ng rolled back f
14fd0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
14fe0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
14ff0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
15000 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74  m field does not
15010 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72   match the recor
15020 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  d content..**.**
15030 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73   Neither of thes
15040 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20  e two scenarios 
15050 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72  are possible dur
15060 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ing a savepoint 
15070 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
15080 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76  If this is a sav
15090 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c  epoint rollback,
150a0 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79   then memory may
150b0 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61   have to be dyna
150c0 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
150d0 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
150e0 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69  ction. If this i
150f0 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61  s the case and a
15100 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  n allocation fai
15110 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ls,.** SQLITE_NO
15120 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
15130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
15140 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
15150 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20  e_page(.  Pager 
15160 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
15170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15180 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65  ager being playe
15190 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20  d back */.  i64 
151a0 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20  *pOffset,       
151b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
151c0 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f  set of record to
151d0 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42   playback */.  B
151e0 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20  itvec *pDone,   
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15200 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  Bitvec of pages 
15210 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62  already played b
15220 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
15230 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
15240 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
15250 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
15260 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
15270 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e  /.  int isSavepn
15280 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
15290 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
152a0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
152b0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
152c0 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
152f0 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
15300 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
15310 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
15320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
15330 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
15340 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
15350 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
15380 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
15390 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  ecking */.  char
153a0 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
153b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
153c0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66  porary storage f
153d0 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  or the page */. 
153e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
153f0 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fd;            /
15400 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
15410 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  iptor for the jo
15420 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
15430 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20  int isSynced;   
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15450 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
15460 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20   page is synced 
15470 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69  */..  assert( (i
15480 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30  sMainJrnl&~1)==0
15490 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61   );      /* isMa
154a0 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31  inJrnl is 0 or 1
154b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69   */.  assert( (i
154c0 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20  sSavepnt&~1)==0 
154d0 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61  );       /* isSa
154e0 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20  vepnt is 0 or 1 
154f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d  */.  assert( isM
15500 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65  ainJrnl || pDone
15510 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65   );     /* pDone
15520 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20   always used on 
15530 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
15540 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
15550 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20  pnt || pDone==0 
15560 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65  );   /* pDone ne
15570 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d  ver used on non-
15580 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  savepoint */..  
15590 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e  aData = pPager->
155a0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73  pTmpSpace;.  ass
155b0 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20  ert( aData );   
155c0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
155d0 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  orage must have 
155e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
155f0 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65  ocated */.  asse
15600 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
15610 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21  pPager)==0 || (!
15620 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73  isMainJrnl && is
15630 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f  Savepnt) );..  /
15640 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74 61  * Either the sta
15650 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  te is greater th
15660 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  an PAGER_WRITER_
15670 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e  CACHEMOD (a tran
15680 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72  saction .  ** or
15690 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
156a0 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20  ack done at the 
156b0 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20 63  request of the c
156c0 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69  aller) or this i
156d0 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  s.  ** a hot-jou
156e0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
156f0 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f  f it is a hot-jo
15700 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
15710 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69  the pager.  ** i
15720 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20  s in state OPEN 
15730 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43  and holds an EXC
15740 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74  LUSIVE lock. Hot
15750 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
15760 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64  k.  ** only read
15770 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
15780 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65  journal, not the
15790 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
157a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
157b0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
157c0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
157d0 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  OD.       || (pP
157e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
157f0 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67  GER_OPEN && pPag
15800 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
15810 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
15820 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15830 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15840 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
15850 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b  || isMainJrnl );
15860 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
15870 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
15880 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
15890 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
158a0 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
158b0 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
158c0 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
158d0 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
158e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
158f0 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
15900 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
15910 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
15920 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
15930 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
15940 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
15950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15960 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
15970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
15980 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44  ead(jfd, (u8*)aD
15990 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
159a0 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
159b0 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
159c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
159d0 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
159e0 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
159f0 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
15a00 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
15a10 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
15a20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
15a30 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
15a40 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
15a50 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
15a60 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
15a70 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
15a80 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
15a90 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
15aa0 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
15ab0 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
15ac0 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
15ad0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
15ae0 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
15af0 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
15b00 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
15b10 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
15b20 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
15b30 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
15b40 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
15b50 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
15b60 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
15b70 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
15b80 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
15b90 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
15ba0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
15bb0 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
15bc0 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
15bd0 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
15be0 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
15bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15c00 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
15c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
15c20 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
15c30 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
15c40 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
15c50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15c60 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
15c70 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
15c80 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61  ager, (u8*)aData
15c90 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
15ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15cb0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
15cc0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
15cd0 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
15ce0 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65  een played by be
15cf0 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
15d00 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
15d10 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
15d20 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
15d30 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
15d40 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
15d50 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
15d60 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
15d70 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
15d80 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15d90 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
15da0 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
15db0 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
15dc0 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
15dd0 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
15de0 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
15df0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
15e00 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
15e10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
15e20 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
15e30 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
15e40 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15e50 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
15e60 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
15e70 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
15e80 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
15e90 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
15ea0 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
15eb0 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
15ec0 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
15ed0 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
15ee0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
15ef0 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
15f00 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
15f10 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
15f20 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
15f30 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
15f40 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
15f50 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
15f60 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
15f70 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
15f80 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
15f90 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
15fa0 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
15fb0 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
15fc0 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
15fd0 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
15fe0 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
15ff0 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
16000 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
16010 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
16020 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
16030 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
16040 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
16050 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
16060 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
16070 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
16080 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
16090 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
160a0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
160b0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
160c0 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
160d0 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
160e0 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
160f0 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
16100 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
16110 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
16120 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
16130 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
16140 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
16150 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
16160 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
16170 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
16180 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
16190 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
161a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
161b0 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
161c0 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
161d0 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
161e0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
161f0 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
16200 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
16210 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
16220 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
16230 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
16240 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
16250 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
16260 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
16270 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
16280 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16290 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
162a0 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
162b0 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
162c0 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
162d0 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
162e0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
162f0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
16300 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
16310 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
16320 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
16330 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
16340 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
16350 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
16360 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
16370 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
16380 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
16390 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
163a0 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
163b0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
163c0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
163d0 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
163e0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
163f0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
16400 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
16410 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
16420 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
16430 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
16440 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
16450 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
16460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
16470 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
16480 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
16490 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
164a0 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
164b0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
164c0 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
164d0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
164e0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
164f0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
16500 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
16510 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
16520 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
16530 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
16540 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
16550 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
16560 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
16570 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
16580 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
16590 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
165a0 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
165b0 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
165c0 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
165d0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
165e0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
165f0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
16600 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
16610 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
16620 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
16630 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
16640 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
16650 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
16660 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
16670 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
16680 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
16690 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
166a0 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
166b0 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61  se{.    pPg = pa
166c0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
166d0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
166e0 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
166f0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
16700 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
16710 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e!=PAGER_OPEN ||
16720 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47   pPg==0 );.  PAG
16730 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
16740 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
16750 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
16760 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
16770 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
16780 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
16790 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
167a0 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
167b0 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
167c0 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
167d0 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
167e0 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
167f0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
16800 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
16810 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
16820 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
16830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
16840 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16850 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
16860 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
16870 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
16880 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
16890 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
168a0 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61  ->fd).   && (pPa
168b0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
168c0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
168d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
168e0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
168f0 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
16900 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
16910 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
16920 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16930 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16940 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
16950 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
16960 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
16970 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  YNC)!=0 );.    a
16980 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
16990 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
169a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
169b0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
169c0 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
169d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
169e0 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
169f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
16a00 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
16a10 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
16a20 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
16a30 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
16a40 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
16a50 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
16a60 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
16a70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
16a80 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  M);.      sqlite
16a90 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
16aa0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
16ab0 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
16ac0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  ;.      CODEC2(p
16ad0 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
16ae0 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45  no, 7, rc=SQLITE
16af0 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a  _NOMEM, aData);.
16b00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16b10 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
16b20 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
16b30 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
16b40 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
16b50 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
16b60 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
16b70 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
16b80 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
16b90 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
16ba0 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
16bb0 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
16bc0 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
16bd0 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
16be0 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
16bf0 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
16c00 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
16c10 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
16c20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
16c30 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
16c40 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
16c50 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
16c60 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
16c70 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
16c80 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
16c90 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
16ca0 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
16cb0 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
16cc0 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
16cd0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
16ce0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
16cf0 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
16d00 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
16d10 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
16d20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
16d30 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
16d40 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
16d50 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
16d60 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
16d70 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
16d80 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
16d90 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
16da0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
16db0 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
16dc0 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
16dd0 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
16de0 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
16df0 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
16e00 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
16e10 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
16e20 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
16e30 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
16e40 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
16e50 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
16e60 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
16e70 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
16e80 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
16e90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16ea0 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
16eb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16ec0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30  r->doNotSpill==0
16ed0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
16ee0 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20  doNotSpill++;.  
16ef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16f00 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
16f10 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
16f20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16f30 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
16f40 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l==1 );.    pPag
16f50 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d  er->doNotSpill--
16f60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16f70 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16f80 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
16f90 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
16fa0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
16fb0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
16fc0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
16fd0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
16fe0 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
16ff0 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
17000 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
17010 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
17020 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
17030 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
17040 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
17050 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
17060 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
17070 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
17080 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
17090 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
170a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
170b0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
170c0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
170d0 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
170e0 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
170f0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
17100 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
17110 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
17120 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
17130 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
17140 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
17150 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
17160 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
17170 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
17180 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
17190 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
171a0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
171b0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
171c0 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
171d0 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
171e0 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
171f0 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
17200 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
17210 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
17220 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
17230 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
17240 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
17250 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
17260 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
17270 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
17280 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
17290 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
172a0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
172b0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
172c0 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
172d0 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
172e0 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
172f0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
17300 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
17310 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
17320 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
17330 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
17340 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
17350 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
17360 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
17370 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
17380 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
17390 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
173a0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
173b0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
173c0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
173d0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
173e0 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
173f0 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
17400 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
17410 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
17420 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
17430 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
17440 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
17450 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17460 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
17470 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
17480 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
17490 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
174a0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
174b0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
174c0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
174d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
174e0 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
174f0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
17500 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
17510 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
17520 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
17530 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
17540 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
17550 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
17560 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
17570 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
17580 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
17590 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
175a0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
175b0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
175c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
175d0 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
175e0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
175f0 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
17600 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
17610 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
17620 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
17630 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
17640 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
17650 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
17660 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
17670 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
17680 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17690 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
176a0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
176b0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
176c0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
176d0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
176e0 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
176f0 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
17700 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
17710 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
17720 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
17730 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
17740 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
17750 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
17760 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
17770 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
17780 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
17790 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
177a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
177b0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
177c0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
177d0 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
177e0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
177f0 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
17800 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
17810 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
17820 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
17830 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17840 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
17850 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
17860 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
17870 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
17880 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
17890 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
178a0 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
178b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
178c0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
178d0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
178e0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
178f0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
17900 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
17910 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17920 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
17930 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
17940 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
17950 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
17960 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
17970 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
17980 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
17990 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
179a0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
179b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
179c0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
179d0 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
179e0 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
179f0 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
17a00 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
17a10 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
17a20 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
17a30 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
17a40 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
17a50 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
17a60 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
17a70 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
17a80 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
17a90 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
17aa0 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
17ab0 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
17ac0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
17ad0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
17ae0 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
17af0 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
17b00 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
17b10 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
17b20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
17b30 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
17b40 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
17b50 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
17b60 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
17b70 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
17b80 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
17b90 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
17ba0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
17bb0 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
17bc0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
17bd0 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
17be0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
17bf0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
17c00 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
17c10 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
17c20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
17c30 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17c40 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
17c50 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
17c60 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
17c70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
17c80 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
17c90 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
17ca0 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
17cb0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
17cc0 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
17cd0 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
17ce0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
17cf0 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
17d00 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
17d10 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
17d20 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
17d30 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
17d40 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
17d50 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
17d60 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
17d70 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
17d80 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
17d90 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
17da0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
17db0 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
17dc0 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
17dd0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
17de0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
17df0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
17e00 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
17e10 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
17e20 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
17e30 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
17e40 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
17e50 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
17e60 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
17e70 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
17e80 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
17e90 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
17ea0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
17eb0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
17ec0 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
17ed0 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
17ee0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
17ef0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
17f00 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
17f10 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
17f20 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
17f30 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
17f40 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
17f50 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
17f60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
17f70 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
17f80 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
17f90 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
17fa0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
17fb0 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
17fc0 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
17fd0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
17fe0 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
17ff0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
18000 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
18010 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
18020 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
18030 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18050 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
18060 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
18070 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
18080 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
18090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
180a0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
180b0 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
180c0 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
180d0 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
180e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
180f0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
18100 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
18110 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
18120 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18130 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
18140 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
18150 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
18160 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18170 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
18180 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nal;           /
18190 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65  * Pointer to one
181a0 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20   journal within 
181b0 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  MJ file */.  cha
181c0 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20  r *zMasterPtr;  
181d0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
181e0 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e  to hold MJ filen
181f0 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e  ame from a journ
18200 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
18210 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20   nMasterPtr;    
18220 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74         /* Amount
18230 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
18240 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74  ted to zMasterPt
18250 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  r[] */..  /* All
18260 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
18270 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61  both the pJourna
18280 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69  l and pMaster fi
18290 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a  le descriptors..
182a0 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66    ** If successf
182b0 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73  ul, open the mas
182c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
182d0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20   for reading..  
182e0 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28  */.  pMaster = (
182f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73  sqlite3_file *)s
18300 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
18310 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
18320 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
18330 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
18340 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
18350 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
18360 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
18370 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
18380 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
183a0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
183b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
183c0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
183d0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
183e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
183f0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18400 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
18410 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
18420 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18430 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18440 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
18450 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
18460 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18470 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
18480 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
18490 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
184a0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
184b0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
184c0 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
184d0 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
184e0 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
184f0 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
18500 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
18510 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
18520 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
18530 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
18540 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
18550 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
18560 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
18570 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
18580 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
18590 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
185a0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
185b0 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
185c0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
185d0 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
185e0 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
185f0 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
18600 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
18610 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
18620 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
18630 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
18640 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18650 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18660 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
18670 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
18680 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
18690 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
186a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
186b0 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
186c0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
186d0 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
186e0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
186f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18700 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18710 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
18720 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
18730 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
18740 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
18750 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
18760 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
18770 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
18780 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
18790 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
187a0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
187b0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
187c0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
187d0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
187e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
187f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18800 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18810 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
18820 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
18830 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
18840 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
18850 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
18860 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
18870 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
18880 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
18890 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
188a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
188b0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
188c0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
188d0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
188e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
188f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18900 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
18910 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
18920 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
18930 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
18940 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
18950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
18960 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
18970 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
18980 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
18990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
189a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
189b0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
189c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
189d0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
189e0 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
189f0 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
18a00 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
18a10 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
18a20 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
18a30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18a40 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
18a50 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18a60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
18a70 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
18a80 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
18a90 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
18aa0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
18ab0 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
18ac0 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
18ad0 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
18ae0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18af0 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
18b00 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18b10 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
18b20 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
18b30 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
18b40 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
18b50 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
18b60 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
18b70 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
18b80 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
18b90 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
18ba0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
18bb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18bc0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
18bd0 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
18be0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
18bf0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
18c00 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
18c10 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
18c20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18c30 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
18c40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
18c50 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18c60 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
18c70 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
18c80 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
18c90 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
18ca0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
18cb0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
18cc0 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
18cd0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
18ce0 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
18cf0 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
18d00 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
18d10 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
18d20 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
18d30 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
18d40 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
18d50 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
18d60 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
18d70 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
18d80 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
18d90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18da0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
18db0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
18dc0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
18dd0 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
18de0 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
18df0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
18e00 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
18e10 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
18e20 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
18e30 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
18e40 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
18e50 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
18e60 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
18e70 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
18e80 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d  * Or, it might m
18e90 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
18ea0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
18eb0 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
18ec0 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
18ed0 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
18ee0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
18ef0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
18f00 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
18f10 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
18f20 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
18f30 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
18f40 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
18f50 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
18f60 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
18f70 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
18f80 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
18f90 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
18fa0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
18fb0 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
18fc0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
18fd0 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
18fe0 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
18ff0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
19000 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
19010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19020 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
19030 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
19040 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
19050 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
19060 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
19070 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
19080 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19090 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
190a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
190b0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
190c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
190d0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
190e0 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
190f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
19100 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
19110 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
19120 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
19130 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
19140 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
19150 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
19160 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
19170 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
19180 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
19190 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
191a0 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
191b0 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
191c0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
191d0 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
191e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
191f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
19200 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
19210 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
19220 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
19230 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
19240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19250 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
19260 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19270 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
19280 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
19290 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
192a0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
192b0 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
192c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
192d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
192e0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
192f0 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
19300 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
19310 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
19320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19330 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
19340 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
19350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19360 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19370 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
19380 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
19390 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
193a0 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
193b0 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
193c0 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
193d0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
193e0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
193f0 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
19400 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
19410 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
19420 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
19430 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
19440 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
19450 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
19460 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
19470 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
19480 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
19490 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
194a0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
194b0 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
194c0 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
194d0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
194e0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
194f0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
19500 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
19510 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
19520 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
19530 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
19540 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
19550 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
19560 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
19570 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
19580 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
19590 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
195a0 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
195b0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
195c0 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
195d0 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
195e0 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
195f0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
19600 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
19610 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
19620 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19630 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
19640 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
19650 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19660 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
19670 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
19680 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
19690 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
196a0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
196b0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
196c0 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
196d0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
196e0 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
196f0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
19700 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
19710 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19720 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
19730 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
19740 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
19750 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
19760 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
19770 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
19780 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
19790 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
197a0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
197b0 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
197c0 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
197d0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
197e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
197f0 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
19800 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
19810 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
19820 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
19830 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
19840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19850 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
19860 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
19870 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
19880 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
19890 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
198a0 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
198b0 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
198c0 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
198d0 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
198e0 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
198f0 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
19900 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19910 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19920 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
19930 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
19940 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
19950 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
19960 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
19970 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
19980 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
19990 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
199a0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
199b0 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
199c0 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
199d0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
199e0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
199f0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
19a00 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
19a10 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
19a20 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
19a30 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19a40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19a50 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
19a60 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
19a70 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
19a80 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
19a90 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
19aa0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19ab0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
19ac0 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
19ad0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
19ae0 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
19af0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
19b00 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
19b10 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19b20 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
19b30 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
19b40 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
19b50 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
19b60 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
19b70 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
19b80 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
19b90 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
19ba0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
19bb0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
19bc0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
19bd0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19be0 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
19bf0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
19c00 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
19c10 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
19c20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
19c30 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
19c40 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
19c50 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
19c60 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
19c70 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
19c80 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
19c90 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
19ca0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
19cb0 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
19cc0 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
19cd0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
19ce0 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
19cf0 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
19d00 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
19d10 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
19d20 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
19d30 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
19d40 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
19d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
19d60 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
19d70 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
19d80 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
19d90 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
19da0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
19db0 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
19dc0 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
19dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19de0 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
19df0 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
19e00 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
19e10 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
19e20 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
19e30 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
19e40 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
19e50 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
19e60 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
19e70 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
19e80 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
19e90 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
19ea0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
19eb0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
19ec0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
19ed0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
19ee0 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
19ef0 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
19f00 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
19f10 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
19f20 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
19f30 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
19f40 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
19f50 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
19f60 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
19f70 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
19f80 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
19f90 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
19fa0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
19fb0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
19fc0 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
19fd0 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
19fe0 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
19ff0 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1a000 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1a010 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1a020 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1a030 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1a040 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1a050 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1a060 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1a070 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1a080 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1a090 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1a0a0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1a0b0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1a0c0 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1a0d0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1a0e0 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1a0f0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a100 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1a110 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1a120 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1a130 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1a140 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1a150 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1a160 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1a170 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1a180 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1a190 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1a1a0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1a1b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1a1c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a1d0 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1a1e0 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1a1f0 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1a200 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1a210 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1a220 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1a230 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1a240 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1a250 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1a260 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1a270 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1a280 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1a290 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1a2a0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1a2b0 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1a2c0 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1a2d0 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1a2e0 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1a2f0 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1a300 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1a310 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1a320 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1a330 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1a340 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1a350 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1a360 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1a370 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1a380 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1a390 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1a3c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1a3d0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1a3e0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1a3f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a400 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1a410 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1a420 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1a430 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1a440 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1a450 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1a460 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1a470 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1a480 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1a490 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4b0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1a4c0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1a4d0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a4f0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1a500 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1a510 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1a520 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1a530 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1a540 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a550 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1a560 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1a570 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1a580 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1a590 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1a5a0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
1a5b0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1a5c0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1a5d0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1a5e0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1a5f0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1a600 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1a610 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1a620 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1a630 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a640 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1a650 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1a660 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a670 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1a680 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1a690 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1a6a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a6b0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1a6c0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1a6d0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1a6e0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1a6f0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1a700 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1a710 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1a720 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1a730 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1a740 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1a750 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1a760 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1a770 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1a780 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1a790 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1a7a0 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1a7b0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1a7c0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1a7d0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1a7e0 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1a7f0 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1a800 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1a810 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1a820 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1a830 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1a840 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1a850 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1a860 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1a870 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1a880 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1a890 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1a8a0 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1a8b0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1a8c0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1a8d0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1a8e0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1a8f0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1a900 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1a910 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1a920 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1a930 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1a940 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1a950 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1a960 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1a970 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1a980 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1a990 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1a9a0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1a9b0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1a9c0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1a9d0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1a9e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a9f0 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1aa00 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1aa10 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1aa20 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1aa30 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1aa40 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1aa50 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1aa60 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1aa70 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1aa80 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1aa90 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1aaa0 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1aab0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1aac0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1aad0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1aae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1aaf0 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1ab00 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1ab10 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1ab20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ab30 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1ab40 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1ab50 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1ab60 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1ab70 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1ab80 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1ab90 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1aba0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1abb0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1abc0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1abd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1abe0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1abf0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1ac00 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1ac10 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1ac20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1ac30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ac40 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1ac50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ac60 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1ac70 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ac80 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1ac90 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1aca0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1acb0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1acc0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1acd0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1ace0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1acf0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1ad00 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1ad10 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1ad20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1ad30 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1ad40 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1ad50 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1ad60 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1ad70 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1ad80 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1ad90 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1ada0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1adb0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1adc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1add0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1ade0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1adf0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1ae00 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1ae10 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1ae20 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1ae30 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1ae40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ae50 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1ae60 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1ae70 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1ae80 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1ae90 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1aea0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1aeb0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1aec0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1aed0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1aee0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1aef0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1af00 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1af10 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1af20 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1af30 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1af40 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1af50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1af60 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1af70 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1af80 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1af90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1afa0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1afb0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1afc0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1afd0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1afe0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1aff0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1b000 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1b010 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1b020 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1b030 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1b040 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1b050 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b060 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1b070 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1b080 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1b090 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1b0a0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1b0b0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1b0c0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1b0d0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1b0e0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1b0f0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1b100 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1b110 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b120 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1b130 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1b140 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1b150 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1b160 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1b170 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1b180 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1b190 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1b1a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b1b0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1b1c0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1b1d0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1b1e0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1b1f0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1b200 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b210 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1b220 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1b230 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1b240 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1b250 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1b260 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b270 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1b280 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1b290 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1b2a0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1b2b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1b2c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b2d0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b2e0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1b2f0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1b300 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1b310 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b330 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b340 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1b350 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1b360 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1b370 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1b380 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1b390 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1b3a0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1b3b0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1b3c0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1b3d0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1b3e0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1b3f0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1b400 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1b410 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1b420 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1b430 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b440 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b450 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b460 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1b470 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1b480 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1b490 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1b4a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b4b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b4c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b4d0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1b4e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b4f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1b500 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b510 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1b520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1b540 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1b550 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1b560 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1b570 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1b580 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1b590 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1b5a0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1b5b0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1b5c0 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1b5d0 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1b5e0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1b5f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1b600 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1b610 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1b620 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1b630 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1b640 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1b650 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1b660 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1b670 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1b680 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1b690 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1b6a0 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1b6b0 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1b6c0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1b6d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b6e0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1b6f0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b710 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1b720 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1b730 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1b740 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1b750 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1b760 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1b770 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1b780 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1b790 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1b7a0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1b7b0 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1b7c0 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1b7d0 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1b7e0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1b7f0 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1b800 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1b810 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1b820 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1b830 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1b840 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b860 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1b870 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1b880 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1b890 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1b8a0 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1b8b0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1b8c0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1b8d0 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1b8e0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1b8f0 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1b900 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1b910 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1b920 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1b930 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1b940 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1b950 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1b960 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1b970 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1b980 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1b990 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1b9a0 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ied..  */.  asse
1b9b0 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rt(.    pPager->
1b9c0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20  fd->pMethods==0 
1b9d0 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ||.    sqlite3Os
1b9e0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
1b9f0 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1ba00 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1ba10 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ,0)>=SQLITE_OK. 
1ba20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
1ba30 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
1ba40 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
1ba50 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
1ba60 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
1ba70 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
1ba80 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
1ba90 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
1baa0 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
1bab0 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
1bac0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
1bad0 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
1bae0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
1baf0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
1bb00 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
1bb10 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
1bb20 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
1bb30 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
1bb40 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
1bb50 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
1bb60 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
1bb70 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
1bb80 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
1bb90 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
1bba0 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
1bbb0 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
1bbc0 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
1bbd0 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
1bbe0 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
1bbf0 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
1bc00 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
1bc10 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1bc20 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
1bc30 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
1bc40 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
1bc50 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
1bc60 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
1bc70 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
1bc80 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1bc90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1bca0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1bcb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
1bcc0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1bcd0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
1bce0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1bcf0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1bd00 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1bd10 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1bd20 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
1bd30 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1bd40 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1bd50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bd60 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
1bd70 6e 63 20 0a 20 20 20 26 26 20 28 70 50 61 67 65  nc .   && (pPage
1bd80 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1bd90 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1bda0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1bdb0 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1bdc0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1bdd0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1bde0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
1bdf0 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
1be00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1be10 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1be20 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1be30 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1be40 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20  ter[0]!='\0');. 
1be50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1be60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1be70 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1be80 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1be90 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1bea0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1beb0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1bec0 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1bed0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1bee0 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1bef0 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1bf00 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1bf10 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1bf20 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1bf30 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1bf40 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1bf50 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1bf60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1bf70 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  K );.  }..  /* T
1bf80 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1bf90 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
1bfa0 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
1bfb0 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
1bfc0 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
1bfd0 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
1bfe0 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
1bff0 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
1c000 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
1c010 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
1c020 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1c030 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
1c040 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
1c050 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1c060 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c070 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1c080 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
1c090 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1c0a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1c0b0 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
1c0c0 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
1c0d0 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
1c0e0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
1c0f0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1c100 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
1c110 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c120 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
1c130 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
1c140 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1c150 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1c160 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
1c170 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
1c180 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1c190 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1c1a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1c1b0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
1c1c0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1c1d0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1c1e0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1c1f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c200 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1c210 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1c220 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1c230 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1c240 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
1c250 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
1c260 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1c270 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
1c280 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1c290 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1c2a0 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
1c2b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c2c0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1c2d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c2e0 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20  /.  int isInWal 
1c2f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1c300 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67 65   /* True if page
1c310 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20   is in log file 
1c320 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
1c330 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c340 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ; /* Number of b
1c350 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
1c360 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c370 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1c380 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1c390 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1c3a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1c3b0 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ) );..  if( NEVE
1c3c0 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  R(!isOpen(pPager
1c3d0 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73  ->fd)) ){.    as
1c3e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
1c3f0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65  mpFile );.    me
1c400 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
1c410 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
1c420 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Size);.    retur
1c430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c440 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
1c450 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1c460 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1c470 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1c480 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1c490 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1c4a0 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28   sqlite3WalRead(
1c4b0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
1c4c0 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67  no, &isInWal, pg
1c4d0 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  sz, pPg->pData);
1c4e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1c4f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49  QLITE_OK && !isI
1c500 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20  nWal ){.    i64 
1c510 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
1c520 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1c530 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
1c540 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1c550 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
1c560 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
1c570 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
1c580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1c590 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1c5a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c5b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1c5c0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1c5d0 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1c5e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1c5f0 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1c600 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1c610 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1c620 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1c630 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1c640 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1c650 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1c660 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1c670 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1c680 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1c690 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1c6a0 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1c6b0 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1c6c0 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1c6d0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1c6e0 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1c6f0 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1c700 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1c710 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1c720 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1c730 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1c740 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1c750 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1c760 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1c770 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1c780 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1c790 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1c7a0 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1c7b0 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1c7c0 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1c7d0 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1c7e0 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1c7f0 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1c800 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1c810 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1c820 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1c830 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
1c840 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
1c850 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1c860 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1c870 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1c880 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1c890 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1c8a0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1c8b0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1c8c0 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1c8d0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1c8e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c8f0 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1c900 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1c910 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1c920 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1c930 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1c940 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1c950 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1c960 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1c970 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1c980 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1c990 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1c9a0 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1c9b0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1c9c0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1c9d0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1c9e0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1c9f0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1ca00 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1ca10 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1ca20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1ca30 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1ca40 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1ca60 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1ca70 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1ca80 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1ca90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1caa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1cab0 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1cac0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1cad0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1cae0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1caf0 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1cb00 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1cb10 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1cb20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1cb30 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1cb40 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1cb50 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1cb60 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1cb70 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1cb80 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1cb90 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1cba0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1cbb0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1cbc0 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1cbd0 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1cbe0 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1cbf0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1cc00 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1cc10 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1cc20 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1cc30 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1cc40 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1cc50 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1cc60 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1cc70 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1cc80 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1cc90 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1cca0 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1ccb0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1ccc0 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1ccd0 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1cce0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1ccf0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1cd00 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1cd10 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1cd20 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1cd30 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1cd40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1cd50 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1cd60 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1cd70 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1cd80 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20   *pPg;..  pPg = 
1cd90 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1cda0 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1cdb0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1cdc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1cdd0 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1cde0 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1cdf0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1ce00 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1ce10 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
1ce20 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
1ce30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ce40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ce50 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
1ce60 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
1ce70 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1ce80 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1ce90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1cea0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20   Normally, if a 
1ceb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1cec0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20  olled back, any 
1ced0 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
1cee0 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65   are.  ** update
1cef0 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70  d as data is cop
1cf00 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72  ied out of the r
1cf10 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1cf20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  and into the.  *
1cf30 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
1cf40 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c   is not generall
1cf50 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20  y possible with 
1cf60 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
1cf70 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  as.  ** rollback
1cf80 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79   involves simply
1cf90 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
1cfa0 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66  log file. Theref
1cfb0 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  ore, if one.  **
1cfc0 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20   or more frames 
1cfd0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1cfe0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1cff0 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66   log (and theref
1d000 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63  ore .  ** also c
1d010 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
1d020 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29  ackup databases)
1d030 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
1d040 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
1d050 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d  ** the backups m
1d060 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64  ust be restarted
1d070 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1d080 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
1d090 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
1d0a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d0b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1d0c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1d0d0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  o rollback a tra
1d0e0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41  nsaction on a WA
1d0f0 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  L database..*/.s
1d100 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52  tatic int pagerR
1d110 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72  ollbackWal(Pager
1d120 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1d130 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d150 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
1d160 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20   PgHdr *pList;  
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74   /* List of dirt
1d190 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72  y pages to rever
1d1a0 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  t */..  /* For a
1d1b0 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
1d1c0 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63  cache that are c
1d1d0 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f  urrently dirty o
1d1e0 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  r have already. 
1d1f0 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e   ** been written
1d200 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74   (but not commit
1d210 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20  ted) to the log 
1d220 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20  file, do one of 
1d230 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  the .  ** follow
1d240 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
1d250 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63   + Discard the c
1d260 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72  ached page (if r
1d270 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a  efcount==0), or.
1d280 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20    **   + Reload 
1d290 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  page content fro
1d2a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  m the database (
1d2b0 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a  if refcount>0)..
1d2c0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
1d2d0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1d2e0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63  dbOrigSize;.  rc
1d2f0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64   = sqlite3WalUnd
1d300 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
1d310 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1d320 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  k, (void *)pPage
1d330 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
1d340 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1d350 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1d360 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  ache);.  while( 
1d370 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
1d380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
1d390 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
1d3a0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
1d3b0 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
1d3c0 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
1d3d0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
1d3e0 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
1d3f0 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
1d400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d410 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d420 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
1d430 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
1d440 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
1d450 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
1d460 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1d470 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1d480 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
1d490 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
1d4a0 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
1d4b0 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
1d4c0 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
1d4d0 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
1d4e0 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
1d4f0 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
1d500 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1d510 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1d520 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1d550 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1d560 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1d570 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1d580 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1d590 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1d5a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1d5b0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1d5c0 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1d5d0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1d5e0 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20  sCommit,        
1d5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d600 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1d610 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1d620 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 20  sync_flags      
1d630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d640 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
1d650 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20  OsSync() (or 0) 
1d660 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d690 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
1d6a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
1d6b0 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  l );.  rc = sqli
1d6c0 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
1d6d0 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
1d6e0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1d6f0 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
1d700 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
1d710 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a  sync_flags.  );.
1d720 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d730 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
1d740 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67  Backup ){.    Pg
1d750 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1d760 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1d770 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1d780 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1d790 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1d7a0 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
1d7b0 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
1d7c0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1d7d0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1d7e0 47 45 53 0a 20 20 7b 0a 20 20 20 20 50 67 48 64  GES.  {.    PgHd
1d7f0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1d800 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1d810 44 69 72 74 79 29 20 70 61 67 65 72 5f 73 65 74  Dirty) pager_set
1d820 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
1d830 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1d840 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d850 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1d860 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1d870 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1d880 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1d890 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1d8a0 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1d8b0 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1d8c0 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1d8d0 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1d8e0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1d8f0 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1d900 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1d910 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1d920 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1d930 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1d940 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1d950 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1d960 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1d970 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1d980 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1d990 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1d9a0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1d9b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1d9c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d9e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1d9f0 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1da00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1da10 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1da20 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1da30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1da40 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1da50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1da60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1da70 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1da80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1da90 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1daa0 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1dab0 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1dac0 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1dad0 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1dae0 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1daf0 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1db00 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1db10 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1db20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1db30 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1db40 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1db50 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1db60 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1db70 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1db80 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1db90 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1dba0 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1dbb0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1dbc0 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1dbd0 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1dbe0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1dbf0 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1dc00 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
1dc10 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
1dc20 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1dc30 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1dc40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1dc50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1dc60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1dc70 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1dc80 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1dc90 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1dca0 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1dcb0 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1dcc0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1dcd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1dce0 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1dcf0 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1dd00 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1dd10 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1dd20 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1dd30 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1dd40 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1dd50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1dd60 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1dd70 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1dd80 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1dd90 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1dda0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1ddb0 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1ddc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1ddd0 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1dde0 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1ddf0 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1de00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1de10 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1de20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1de30 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1de40 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1de70 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1de80 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1de90 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1dea0 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1deb0 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1dec0 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1ded0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1dee0 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1def0 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1df00 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1df10 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1df20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1df30 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1df40 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1df50 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1df60 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1df70 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1df80 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1df90 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1dfa0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1dfb0 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1dfc0 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1dfd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1dfe0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1dff0 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1e000 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1e010 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
1e020 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1e030 63 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  ck );.  nPage = 
1e040 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1e050 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1e060 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
1e070 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e  abase size was n
1e080 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ot available fro
1e090 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1e0a0 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72  stem,.  ** deter
1e0b0 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e  mine it based on
1e0c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1e0d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1e0e0 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a  If the size.  **
1e0f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e100 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20   file is not an 
1e110 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
1e120 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
1e130 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f  e,.  ** round do
1e140 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73  wn to the neares
1e150 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20  t page. Except, 
1e160 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20  any file larger 
1e170 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65  than 0.  ** byte
1e180 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
1e190 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61  sidered to conta
1e1a0 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
1e1b0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1e1c0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1e1d0 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e1f0 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
1e200 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1e210 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1e220 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1e230 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1e240 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
1e250 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1e260 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1e270 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1e280 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1e290 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1e2a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e2b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1e2c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e2d0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1e2e0 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1e2f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
1e300 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e 3e  ( nPage==0 && n>
1e310 30 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  0 ){.      nPage
1e320 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1e330 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1e340 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
1e350 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1e360 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1e370 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
1e380 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
1e390 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
1e3a0 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
1e3b0 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
1e3c0 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
1e3d0 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
1e3e0 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
1e3f0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1e400 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
1e410 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
1e420 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
1e430 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1e440 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1e450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e460 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _WAL./*.** Check
1e470 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
1e480 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
1e490 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
1e4a0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
1e4b0 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69  ager.** exists i
1e4c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1e4d0 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76  s not empy, or v
1e4e0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a  erify that the *
1e4f0 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  -wal file does.*
1e500 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20  * not exist (by 
1e510 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20  deleting it) if 
1e520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e530 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
1e540 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1e550 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61  e is not empty a
1e560 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  nd the *-wal fil
1e570 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74  e exists, open t
1e580 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57  he pager.** in W
1e590 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65  AL mode.  If the
1e5a0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
1e5b0 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61  ty or if no *-wa
1e5c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
1e5d0 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72  d.** if no error
1e5e0 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
1e5f0 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
1e600 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
1e610 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  to.** PAGER_JOUR
1e620 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a  NALMODE_WAL..**.
1e630 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1e640 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  _OK or an error 
1e650 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
1e660 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64  caller must hold
1e670 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
1e680 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1e690 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ile to call this
1e6a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65  .** function. Be
1e6b0 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49  cause an EXCLUSI
1e6c0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1e6d0 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  b file is requir
1e6e0 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a  ed to delete .**
1e6f0 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65   a WAL on a none
1e700 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c  -empty database,
1e710 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
1e720 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63  ere is no race c
1e730 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74  ondition .** bet
1e740 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73  ween the xAccess
1e750 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20  () below and an 
1e760 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20  xDelete() being 
1e770 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65  executed by some
1e780 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65   .** other conne
1e790 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1e7a0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61   int pagerOpenWa
1e7b0 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72  lIfPresent(Pager
1e7c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1e7d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e7e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e7f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1e800 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
1e810 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1e820 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  >=SHARED_LOCK ||
1e830 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
1e840 6f 63 6b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ock );..  if( !p
1e850 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1e860 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
1e870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e880 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e890 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
1e8a0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  */.    Pgno nPag
1e8b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e8c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e8e0 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70  e */..    rc = p
1e8f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1e900 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
1e910 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1e920 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e  rn rc;.    if( n
1e930 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
1e940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
1e950 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
1e960 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
1e970 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61  , 0);.      isWa
1e980 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
1e990 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1e9a0 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
1e9b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e9c0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
1e9d0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
1e9e0 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c  S_EXISTS, &isWal
1e9f0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
1ea00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ea10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1ea20 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
1ea30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
1ea40 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
1ea50 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
1ea60 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
1ea70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ea80 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
1ea90 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ger, 0);.      }
1eaa0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1eab0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
1eac0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1ead0 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WAL ){.        p
1eae0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1eaf0 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
1eb00 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20  ALMODE_DELETE;. 
1eb10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1eb20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1eb30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c  #endif../*.** Pl
1eb40 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  ayback savepoint
1eb50 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c   pSavepoint. Or,
1eb60 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d   if pSavepoint==
1eb70 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62  NULL, then playb
1eb80 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  ack.** the entir
1eb90 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1eba0 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20   file. The case 
1ebb0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
1ebc0 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a   occurs when .**
1ebd0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63   a ROLLBACK TO c
1ebe0 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65  ommand is invoke
1ebf0 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54  d on a SAVEPOINT
1ec00 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73   that is a trans
1ec10 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70  action .** savep
1ec20 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oint..**.** When
1ec30 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e   pSavepoint is n
1ec40 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67  ot NULL (meaning
1ec50 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69   a non-transacti
1ec60 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
1ec70 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  .** being rolled
1ec80 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65   back), then the
1ec90 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73   rollback consis
1eca0 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65  ts of up to thre
1ecb0 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72  e stages,.** per
1ecc0 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72  formed in the or
1ecd0 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a  der specified:.*
1ece0 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
1ecf0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  re played back f
1ed00 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
1ed10 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
1ed20 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66   byte.**     off
1ed30 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  set PagerSavepoi
1ed40 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
1ed50 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a  ontinuing to .**
1ed60 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
1ed70 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20  int.iHdrOffset, 
1ed80 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
1ed90 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1eda0 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66  l.**     file if
1edb0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1edc0 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65  iHdrOffset is ze
1edd0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ro..**.**   * If
1ede0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1edf0 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f  iHdrOffset is no
1ee00 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67  t zero, then pag
1ee10 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a  es are played.**
1ee20 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69       back starti
1ee30 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
1ee40 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64  nal header immed
1ee50 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
1ee60 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
1ee70 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
1ee80 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  et to the end of
1ee90 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1eea0 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  l file..**.**   
1eeb0 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e  * Pages are then
1eec0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
1eed0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
1eee0 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67  l file, starting
1eef0 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65  .**     with the
1ef00 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1ef10 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74  iSubRec and cont
1ef20 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e  inuing to the en
1ef30 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20  d of.**     the 
1ef40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
1ef50 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74  .** Throughout t
1ef60 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63  he rollback proc
1ef70 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61  ess, each time a
1ef80 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20   page is rolled 
1ef90 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72  back, the.** cor
1efa0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
1efb0 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65  s set in a bitve
1efc0 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72  c structure (var
1efd0 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74  iable pDone in t
1efe0 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
1eff0 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69  tion below). Thi
1f000 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73  s is used to ens
1f010 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20  ure that a page 
1f020 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65  is only.** rolle
1f030 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74  d back the first
1f040 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
1f050 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65  untered in eithe
1f060 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  r journal..**.**
1f070 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69   If pSavepoint i
1f080 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67  s NULL, then pag
1f090 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79  es are only play
1f0a0 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
1f0b0 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
1f0c0 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20   file. There is 
1f0d0 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69  no need for a bi
1f0e0 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73  tvec in this cas
1f0f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68  e..**.** In eith
1f100 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20  er case, before 
1f110 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63  playback commenc
1f120 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53  es the Pager.dbS
1f130 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1f140 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20  is reset to the 
1f150 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65  value that it he
1f160 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ld at the start 
1f170 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
1f180 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63   .** (or transac
1f190 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77  tion). No page w
1f1a0 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65  ith a page-numbe
1f1b0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1f1c0 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  his value.** is 
1f1d0 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20  played back. If 
1f1e0 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  one is encounter
1f1f0 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20  ed it is simply 
1f200 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
1f210 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79  ic int pagerPlay
1f220 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61  backSavepoint(Pa
1f230 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67  ger *pPager, Pag
1f240 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
1f250 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20  vepoint){.  i64 
1f260 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1f270 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76       /* Effectiv
1f280 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
1f290 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
1f2a0 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
1f2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
1f2c0 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74  of first segment
1f2d0 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c   of main-journal
1f2e0 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   records */.  in
1f2f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f300 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
1f310 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65   code */.  Bitve
1f320 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20  c *pDone = 0;   
1f330 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f      /* Bitvec to
1f340 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c   ensure pages pl
1f350 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f  ayed back only o
1f360 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  nce */..  assert
1f370 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1f380 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
1f390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f3a0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1f3b0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
1f3c0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1f3d0 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
1f3e0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
1f3f0 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
1f400 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
1f410 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
1f420 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
1f430 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
1f440 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
1f450 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
1f460 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1f480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
1f490 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
1f4a0 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
1f4b0 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
1f4c0 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
1f4d0 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
1f4e0 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
1f4f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
1f500 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
1f510 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
1f520 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
1f530 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1f540 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1f550 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
1f560 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
1f570 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
1f580 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
1f590 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1f5a0 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
1f5b0 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
1f5c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
1f5d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1f5e0 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
1f5f0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
1f600 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
1f610 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
1f620 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
1f630 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
1f640 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
1f650 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1f660 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
1f670 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
1f680 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
1f690 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
1f6a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1f6b0 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
1f6c0 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
1f6d0 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
1f6e0 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
1f6f0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1f700 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
1f710 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
1f720 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
1f730 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
1f740 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1f750 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
1f760 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1f770 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
1f780 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
1f790 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1f7a0 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
1f7b0 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
1f7c0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
1f7d0 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
1f7e0 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
1f7f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1f800 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
1f810 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
1f820 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
1f830 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
1f840 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
1f850 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
1f860 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
1f870 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
1f880 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
1f890 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
1f8a0 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
1f8b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1f8c0 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
1f8d0 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
1f8e0 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
1f8f0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
1f900 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
1f910 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
1f920 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
1f930 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
1f940 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1f950 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1f960 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
1f970 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1f980 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
1f990 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
1f9a0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
1f9b0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
1f9c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1f9d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
1f9e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
1f9f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1fa00 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
1fa10 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
1fa20 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
1fa30 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1fa40 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
1fa50 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
1fa60 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
1fa70 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
1fa80 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
1fa90 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
1faa0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1fab0 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
1fac0 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
1fad0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
1fae0 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
1faf0 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
1fb00 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
1fb10 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
1fb20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1fb30 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1fb40 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
1fb50 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
1fb60 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1fb70 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
1fb80 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
1fb90 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
1fba0 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
1fbb0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
1fbc0 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
1fbd0 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
1fbe0 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
1fbf0 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
1fc00 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
1fc10 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
1fc20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
1fc30 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1fc40 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1fc50 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1fc60 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
1fc70 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
1fc80 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
1fc90 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
1fca0 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
1fcb0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1fcc0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
1fcd0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1fce0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
1fcf0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
1fd00 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
1fd10 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1fd20 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1fd30 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1fd40 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
1fd50 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
1fd60 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
1fd70 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
1fd80 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1fd90 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
1fda0 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
1fdb0 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
1fdc0 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
1fdd0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
1fde0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
1fdf0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1fe00 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
1fe10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fe20 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
1fe30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1fe40 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
1fe50 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
1fe60 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
1fe70 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
1fe80 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
1fe90 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
1fea0 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
1feb0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
1fec0 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
1fed0 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
1fee0 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
1fef0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
1ff00 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
1ff10 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
1ff20 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
1ff30 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
1ff40 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
1ff50 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
1ff60 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
1ff70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
1ff80 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
1ff90 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1ffa0 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
1ffb0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
1ffc0 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
1ffd0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
1ffe0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
1fff0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
20010 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28  alSavepointUndo(
20020 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53  pPager->pWal, pS
20030 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61  avepoint->aWalDa
20040 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ta);.    }.    f
20050 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
20060 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
20070 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70  QLITE_OK && ii<p
20080 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20  Pager->nSubRec; 
20090 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
200a0 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a  ert( offset==ii*
200b0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
200c0 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
200d0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
200e0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
200f0 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
20100 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
20110 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
20120 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
20130 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
20140 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
20150 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
20170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20180 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
20190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
201a0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
201b0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
201c0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
201d0 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
201e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
201f0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
20200 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
20210 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
20220 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
20230 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
20240 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
20250 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ge);.}../*.** Ad
20260 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
20270 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
20280 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
20290 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
202a0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
202b0 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
202c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
202d0 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
202e0 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
202f0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
20300 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
20310 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
20320 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
20330 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
20340 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
20350 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
20360 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20370 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
20380 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
20390 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
203a0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
203b0 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
203c0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
203d0 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
203e0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
203f0 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
20400 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
20410 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
20420 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20430 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
20440 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
20450 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
20460 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
20470 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
20480 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
20490 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
204a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
204c0 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
204d0 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
204e0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
204f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20500 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
20510 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
20520 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
20530 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
20540 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
20550 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
20560 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
20570 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
20580 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
20590 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
205a0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
205b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
205c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
205d0 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
205e0 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
205f0 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
20600 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
20610 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
20620 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
20640 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
20650 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
20660 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
20670 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
20680 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
20690 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
206a0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
206b0 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
206c0 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
206d0 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
206e0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
206f0 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
20700 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
20710 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
20720 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
20730 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
20740 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
20750 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
20760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20770 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
20780 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
20790 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
207a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
207b0 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62  int level, int b
207c0 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50  FullFsync){.  pP
207d0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
207e0 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
207f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
20800 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
20810 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
20820 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
20830 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
20840 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
20850 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
20860 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
20870 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
20880 4e 4f 52 4d 41 4c 29 3b 0a 7d 0a 23 65 6e 64 69  NORMAL);.}.#endi
20890 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
208a0 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
208b0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
208c0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
208d0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
208e0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
208f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
20900 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
20910 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
20920 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
20930 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
20940 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
20950 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
20960 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
20970 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
20980 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
20990 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
209a0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
209b0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
209c0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
209d0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
209e0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
209f0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
20a00 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
20a10 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
20a20 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
20a30 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
20a40 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
20a50 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
20a60 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
20a70 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
20a80 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
20a90 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
20aa0 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
20ab0 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
20ac0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
20ad0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
20ae0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
20af0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
20b00 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
20b10 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
20b20 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
20b30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
20b40 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
20b50 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
20b60 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
20b70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
20b80 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
20b90 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
20ba0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
20bb0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
20bc0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
20bd0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
20be0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
20bf0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
20c00 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
20c10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
20c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20c30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
20c40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
20c50 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
20c60 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
20c70 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
20c80 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
20c90 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
20ca0 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
20cb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
20cc0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
20cd0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
20ce0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20cf0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
20d00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
20d10 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
20d20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
20d30 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
20d40 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
20d50 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
20d60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
20d70 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
20d80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20d90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
20da0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
20db0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
20dc0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
20dd0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
20de0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
20df0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
20e00 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
20e10 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
20e20 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
20e30 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
20e40 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
20e50 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
20e60 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
20e70 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
20e80 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
20e90 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
20ea0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
20eb0 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
20ec0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
20ed0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
20ee0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
20ef0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
20f00 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
20f10 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
20f20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
20f30 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
20f40 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
20f50 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
20f60 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
20f70 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
20f80 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
20f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
20fc0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
20fd0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
20fe0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
20ff0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
21000 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
21010 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
21020 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
21030 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
21040 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
21050 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
21060 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
21070 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
21080 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
21090 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
210a0 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
210b0 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
210c0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
210d0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
210e0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
210f0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
21100 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
21110 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
21120 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
21130 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
21140 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
21150 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
21180 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
21190 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
211a0 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
211b0 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
211c0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
211d0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
211e0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
211f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
21200 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
21210 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
21220 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
21230 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
21240 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
21250 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
21260 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
21270 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
21280 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
21290 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
212a0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
212b0 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
212c0 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
212d0 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
212e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
212f0 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
21300 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
21310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21320 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
21330 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
21340 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
21350 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
21360 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
21370 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
21380 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c  TE_IOERR, an SQL
21390 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75  ITE_IOERR_xxx su
213a0 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45  b-code or SQLITE
213b0 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
213c0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
213d0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
213e0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
213f0 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
21400 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
21410 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
21420 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
21430 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
21440 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
21450 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
21460 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
21470 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
21480 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
21490 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
214a0 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
214b0 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
214c0 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
214d0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
214e0 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
214f0 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
21500 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
21510 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
21520 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
21530 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
21540 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
21550 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
21560 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
21570 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
21580 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
21590 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
215a0 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
215b0 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
215c0 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
215d0 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
215e0 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
215f0 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
21600 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
21610 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
21620 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
21630 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
21640 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
21650 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
21660 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
21670 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
21680 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
21690 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
216a0 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
216b0 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
216c0 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
216d0 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
216e0 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
216f0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
21700 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
21710 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
21720 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
21730 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
21740 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
21750 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
21760 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
21770 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
21780 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
21790 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
217a0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
217b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
217c0 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
217d0 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65  ager, u32 *pPage
217e0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
217f0 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
21800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
21810 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
21820 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c  ble to do a full
21830 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
21840 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74  ate() here, as t
21850 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
21860 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
21870 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65  from within Page
21880 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20  rOpen(), before 
21890 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f  the state.  ** o
218a0 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
218b0 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ct is internally
218c0 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
218d0 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f  *.  ** At one po
218e0 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  int this functio
218f0 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  n returned an er
21900 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72  ror if the pager
21910 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41   was in .  ** PA
21920 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
21930 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52   But since PAGER
21940 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61  _ERROR state gua
21950 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a  rantees that.  *
21960 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65  * there is at le
21970 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
21980 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
21990 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ce, this functio
219a0 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  n.  ** is a no-o
219b0 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  p for that case 
219c0 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20  anyhow..  */..  
219d0 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u32 pageSize = *
219e0 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
219f0 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
21a00 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
21a10 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
21a20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
21a30 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28  SIZE) );.  if( (
21a40 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
21a50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
21a60 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c  ze==0).   && sql
21a70 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
21a80 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
21a90 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61  he)==0 .   && pa
21aa0 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
21ab0 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d  ze!=(u32)pPager-
21ac0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
21ad0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
21ae0 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
21af0 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
21b00 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  pace */.    i64 
21b10 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  nByte = 0;..    
21b20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
21b30 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  te>PAGER_OPEN &&
21b40 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
21b50 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  fd) ){.      rc 
21b60 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
21b70 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
21b80 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20  &nByte);.    }. 
21b90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e  E_OK ){.      pN
21bb0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
21bc0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
21bd0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
21be0 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d  if( !pNew ) rc =
21bf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21c00 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
21c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21c20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
21c30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
21c40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
21c50 20 28 50 67 6e 6f 29 28 6e 42 79 74 65 2f 70 61   (Pgno)(nByte/pa
21c60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
21c70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
21c80 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
21c90 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
21ca0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
21cb0 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ace);.      pPag
21cc0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
21cd0 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71 6c 69  pNew;.      sqli
21ce0 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
21cf0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
21d00 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
21d10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
21d20 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
21d30 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
21d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21d50 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73   ){.    if( nRes
21d60 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
21d70 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
21d80 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
21d90 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
21da0 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
21db0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
21dc0 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
21dd0 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
21de0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
21df0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
21e00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
21e10 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21e20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
21e30 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
21e40 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
21e50 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
21e60 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
21e70 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
21e80 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
21e90 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
21ea0 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
21eb0 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
21ec0 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
21ed0 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
21ee0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
21ef0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
21f00 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
21f10 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
21f20 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
21f30 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
21f40 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
21f50 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
21f60 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
21f70 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
21f80 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
21f90 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
21fa0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21fb0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
21fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
21fd0 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
21fe0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
21ff0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
22000 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
22010 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
22020 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
22030 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
22040 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
22050 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
22060 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
22070 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
22080 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
22090 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
220a0 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
220b0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
220c0 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
220d0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
220e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
220f0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
22100 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
22110 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
22120 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
22130 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
22140 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  age;.  }.  if( p
22150 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
22160 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
22170 67 65 72 2d 3e 6d 78 50 67 6e 6f 3c 70 50 61 67  ger->mxPgno<pPag
22180 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
22190 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
221a0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
221b0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
221c0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
221d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
221e0 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
221f0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
22200 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
22210 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
22220 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
22230 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
22240 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
22250 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
22260 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
22270 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
22280 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
22290 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
222a0 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
222b0 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
222c0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
222d0 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
222e0 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
222f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
22300 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
22310 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
22320 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
22330 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
22340 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
22350 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
22360 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
22370 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
22380 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
22390 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
223a0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
223b0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
223c0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
223d0 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
223e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
223f0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
22400 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
22410 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
22420 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
22430 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
22440 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
22450 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
22460 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
22470 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
22480 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
22490 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
224a0 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
224b0 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
224c0 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
224d0 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
224e0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  o. .**.** If the
224f0 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65   pager was opene
22500 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  d on a transient
22510 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65   file (zFilename
22520 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65  ==""), or.** ope
22530 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65  ned on a file le
22540 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20  ss than N bytes 
22550 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74  in size, the out
22560 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  put buffer is.**
22570 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49   zeroed and SQLI
22580 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
22590 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f  The rationale fo
225a0 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
225b0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
225c0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
225d0 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
225e0 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61  s, and a new tra
225f0 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72  nsient or.** zer
22600 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65  o sized database
22610 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68   has a header th
22620 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  an consists enti
22630 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a  rely of zeroes..
22640 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20  **.** If any IO 
22650 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d  error apart from
22660 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
22670 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f  ORT_READ is enco
22680 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20  untered,.** the 
22690 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
226a0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
226b0 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e  ller and the con
226c0 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
226d0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e  output buffer un
226e0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
226f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
22700 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
22710 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
22720 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
22730 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
22740 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22750 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
22760 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69   N);.  assert( i
22770 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
22780 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
22790 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54  pFile );..  /* T
227a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
227b0 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74  nly called by bt
227c0 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ree immediately 
227d0 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20  after creating. 
227e0 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62   ** the Pager ob
227f0 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73  ject.  There has
22800 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70   not been an opp
22810 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e  ortunity to tran
22820 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57  sition.  ** to W
22830 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a  AL mode yet..  *
22840 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
22850 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
22860 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65   );..  if( isOpe
22870 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
22880 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
22890 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
228a0 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
228b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
228c0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
228d0 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
228e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
228f0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
22900 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
22910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
22920 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22940 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
22950 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
22960 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
22970 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a  ion is open on.*
22980 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  * the pager. It 
22990 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
229a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
229b0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
229c0 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72  e..**.** However
229d0 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
229e0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
229f0 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
22a00 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
22a10 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
22a20 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
22a30 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
22a40 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
22a50 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
22a60 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
22a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22a80 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
22a90 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
22aa0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
22ab0 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
22ac0 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a  _FINISHED );.  *
22ad0 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50  pnPage = (int)pP
22ae0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a  ager->dbSize;.}.
22af0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
22b00 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
22b10 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e  type locktype on
22b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22b30 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69  le. If.** a simi
22b40 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c  lar or greater l
22b50 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
22b60 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
22b70 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a  on is a no-op.**
22b80 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49   (returning SQLI
22b90 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c  TE_OK immediatel
22ba0 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  y)..**.** Otherw
22bb0 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ise, attempt to 
22bc0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
22bd0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c  using sqlite3OsL
22be0 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a  ock(). Invoke .*
22bf0 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * the busy callb
22c00 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ack if the lock 
22c10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
22c20 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65   available. Repe
22c30 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65  at .** until the
22c40 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
22c50 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20  eturns false or 
22c60 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70  until the attemp
22c70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20  t to .** obtain 
22c80 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
22c90 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
22ca0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22cb0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
22cc0 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
22cd0 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
22ce0 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  e lock. If the l
22cf0 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
22d00 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65  successfully, se
22d10 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74  t the Pager.stat
22d20 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  e .** variable t
22d30 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72  o locktype befor
22d40 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
22d50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
22d60 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
22d70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22d80 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
22d90 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22db0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22dc0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e */..  /* Check
22dd0 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69   that this is ei
22de0 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65  ther a no-op (be
22df0 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73  cause the reques
22e00 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a  ted lock is .  *
22e10 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  * already held, 
22e20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72  or one of the tr
22e30 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20  ansistions that 
22e40 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
22e50 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76  .  ** may be inv
22e60 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63  oked during, acc
22e70 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  ording to the co
22e80 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a  mment above.  **
22e90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22ea0 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20  Busyhandler().. 
22eb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
22ec0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f  Pager->eLock>=lo
22ed0 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c  cktype).       |
22ee0 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
22ef0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  ==NO_LOCK && loc
22f00 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
22f10 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  CK).       || (p
22f20 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  Pager->eLock==RE
22f30 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c  SERVED_LOCK && l
22f40 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
22f50 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20  VE_LOCK).  );.. 
22f60 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70   do {.    rc = p
22f70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
22f80 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  r, locktype);.  
22f90 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
22fa0 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
22fb0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
22fc0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
22fd0 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65  dlerArg) );.  re
22fe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22ff0 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72  * Function asser
23000 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
23010 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63  int(pPager) chec
23020 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ks that one of t
23030 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
23040 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c   is true for all
23050 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72   dirty pages cur
23060 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
23070 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20  ge-cache:.**.** 
23080 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75    a) The page nu
23090 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
230a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
230b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
230c0 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64  *      current d
230d0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
230e0 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a  n pages, OR.**.*
230f0 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61  *   b) if the pa
23100 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20  ge content were 
23110 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20  written at this 
23120 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  time, it would n
23130 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65  ot.**      be ne
23140 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
23150 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
23160 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20  tent out to the 
23170 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
23180 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e      (as determin
23190 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73  ed by function s
231a0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
231b0 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ))..**.** If the
231c0 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72   condition asser
231d0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
231e0 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
231f0 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  ue, and the.** d
23200 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74  irty page were t
23210 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66  o be discarded f
23220 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69  rom the cache vi
23230 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  a the pagerStres
23240 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  s().** routine, 
23250 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f  pagerStress() wo
23260 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68  uld not write th
23270 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
23280 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ontent to.** the
23290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
232a0 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74  If a savepoint t
232b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20  ransaction were 
232c0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
232d0 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e  r.** this happen
232e0 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  ed, the correct 
232f0 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20  behaviour would 
23300 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
23310 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
23320 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
23330 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
23340 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
23350 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
23360 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
23370 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
23380 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
23390 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
233a0 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
233b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
233c0 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
233d0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
233e0 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
233f0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
23400 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
23410 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
23420 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
23430 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
23440 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
23450 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
23460 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
23470 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
23480 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
23490 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
234a0 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
234b0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
234c0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
234d0 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
234e0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
234f0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
23500 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
23510 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
23520 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
23530 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
23540 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
23550 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
23560 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
23570 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
23580 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
23590 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
235a0 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
235b0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
235c0 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
235d0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
235e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
235f0 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
23600 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
23610 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
23620 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
23630 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
23640 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
23650 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
23660 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
23670 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
23680 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
23690 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
236a0 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
236b0 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
236c0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
236d0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
236e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
236f0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
23700 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
23710 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
23720 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23730 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
23740 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23750 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
23760 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
23770 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
23780 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
23790 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
237a0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
237b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
237c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
237d0 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
237e0 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
237f0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
23800 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
23810 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
23820 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
23830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
23840 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
23850 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
23860 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
23870 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
23880 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
23890 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
238a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
238b0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
238c0 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
238d0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
238e0 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
238f0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
23900 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
23910 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
23920 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
23930 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
23940 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
23950 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
23960 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
23970 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
23980 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
23990 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
239a0 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
239b0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
239c0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
239d0 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
239e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
239f0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
23a00 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
23a10 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
23a20 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
23a30 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
23a40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
23a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23a60 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
23a70 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
23a80 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
23a90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
23aa0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23ab0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
23ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23ae0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
23af0 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
23b00 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
23b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23b20 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
23b30 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
23b40 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
23b50 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
23b60 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
23b70 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
23b80 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
23b90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
23ba0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
23bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
23bc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
23bd0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
23be0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
23bf0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
23c00 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
23c10 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
23c20 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
23c30 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
23c40 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
23c50 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
23c60 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
23c70 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
23c80 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
23c90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
23ca0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
23cb0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
23cc0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
23cd0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
23ce0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
23cf0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
23d00 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
23d10 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
23d20 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
23d30 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
23d40 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
23d50 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
23d60 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
23d70 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
23d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
23d90 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
23da0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
23db0 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
23dc0 6d 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61  mpSpace;..  disa
23dd0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
23de0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
23df0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
23e00 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50  alloc();.  /* pP
23e10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
23e20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
23e30 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
23e40 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
23e50 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
23e60 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
23e70 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20 28  ger->pWal,.    (
23e80 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
23e90 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e   0 : pPager->syn
23ea0 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20 70  c_flags), .    p
23eb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
23ec0 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50 61   pTmp.  );.  pPa
23ed0 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
23ee0 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
23ef0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
23f00 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
23f10 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
23f20 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
23f30 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
23f40 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
23f50 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
23f60 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
23f70 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
23f80 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
23f90 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
23fa0 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
23fb0 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
23fc0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
23fd0 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
23fe0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
23ff0 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
24000 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
24010 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
24020 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
24030 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
24040 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
24050 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
24060 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
24070 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
24080 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
24090 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
240a0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
240b0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
240c0 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
240d0 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
240e0 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
240f0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
24100 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
24110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
24120 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
24130 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
24140 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
24150 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
24160 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
24170 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
24180 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
24190 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
241a0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
241b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
241c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
241d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
241e0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
241f0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
24200 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
24210 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
24220 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
24230 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
24240 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
24250 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
24260 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
24270 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24280 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
24290 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
242a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
242b0 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
242c0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
242d0 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
242e0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
242f0 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
24300 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
24310 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
24320 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
24330 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
24340 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
24350 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
24360 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
24370 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
24380 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
24390 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
243a0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
243b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
243c0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
243d0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
243e0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
243f0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
24400 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
24410 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
24420 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
24430 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
24440 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24450 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
24460 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
24470 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
24480 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
24490 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
244a0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
244b0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
244c0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
244d0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
244e0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
244f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
24500 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
24510 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
24520 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
24530 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
24540 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
24550 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
24560 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
24570 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
24580 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
24590 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
245a0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
245b0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
245c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
245d0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
245e0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
245f0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
24600 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
24610 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
24620 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
24630 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
24640 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
24650 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
24660 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
24670 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24680 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
24690 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
246a0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
246b0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
246c0 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
246d0 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
246e0 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
246f0 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  he the file-syst
24700 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
24710 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
24720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
24730 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
24740 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
24750 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
24760 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
24770 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
24780 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
24790 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
247a0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
247b0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
247c0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
247d0 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
247e0 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
247f0 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
24800 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
24810 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
24820 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
24830 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
24840 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
24850 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
24860 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
24870 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
24880 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
24890 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
248a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
248b0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
248c0 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
248d0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
248e0 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
248f0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
24900 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
24910 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
24920 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
24930 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
24940 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
24950 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
24960 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
24970 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
24980 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
24990 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
249a0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
249b0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
249c0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
249d0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
249e0 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
249f0 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
24a00 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
24a10 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
24a20 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
24a30 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
24a40 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
24a50 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
24a60 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
24a70 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
24a80 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
24a90 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
24aa0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
24ab0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
24ac0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
24ad0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
24ae0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
24af0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
24b00 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
24b10 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
24b20 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
24b30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24b40 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
24b50 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
24b80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24b90 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
24ba0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
24bb0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
24bc0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
24bd0 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
24be0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
24bf0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
24c00 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
24c10 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
24c20 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
24c30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24c40 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
24c50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
24c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
24c70 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
24c80 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
24c90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
24ca0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
24cb0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
24cc0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
24cd0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
24ce0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
24cf0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
24d00 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
24d10 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
24d20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
24d30 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
24d40 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
24d50 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
24d60 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
24d70 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
24d80 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
24d90 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
24da0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
24db0 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
24dc0 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
24dd0 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
24de0 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
24df0 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
24e00 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
24e10 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
24e20 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
24e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
24e40 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
24e50 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
24e60 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
24e70 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
24e80 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
24e90 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
24ea0 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
24eb0 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
24ec0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
24ed0 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
24ee0 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
24ef0 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
24f00 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
24f10 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
24f20 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
24f30 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
24f40 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
24f50 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
24f60 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
24f70 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
24f80 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
24f90 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
24fa0 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
24fb0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
24fc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
24fd0 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
24fe0 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
24ff0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
25000 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
25010 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
25020 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
25030 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
25040 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
25050 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
25060 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
25070 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
25080 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
25090 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
250a0 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
250b0 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
250c0 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
250d0 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
250e0 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
250f0 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
25100 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
25110 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25120 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
25130 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
25140 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
25150 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
25160 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
25170 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
25180 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
25190 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
251a0 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
251b0 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
251c0 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
251d0 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
251e0 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
251f0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
25200 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
25210 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
25220 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
25230 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
25240 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
25250 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
25260 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
25270 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
25280 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
25290 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
252a0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
252b0 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
252c0 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
252d0 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
252e0 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
252f0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
25300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25310 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
25320 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
25330 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
25340 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
25350 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
25360 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
25370 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
25380 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
25390 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
253a0 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
253b0 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
253c0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
253d0 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
253e0 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
253f0 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
25400 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
25410 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
25420 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25430 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
25440 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
25450 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
25460 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
25470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
25480 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
25490 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
254a0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
254b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
254c0 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
254d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
254e0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
254f0 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
25500 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
25510 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
25520 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
25530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
25540 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
25550 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
25560 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
25570 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
25580 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
25590 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
255a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
255b0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
255c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
255d0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
255e0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
255f0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
25600 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
25610 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
25620 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
25630 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
25640 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
25650 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
25660 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
25670 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
25680 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
25690 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
256a0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
256b0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
256c0 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
256d0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
256e0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
256f0 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
25700 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
25710 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
25720 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
25730 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
25740 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
25750 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
25760 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
25770 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
25780 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
25790 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
257a0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
257b0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
257c0 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
257d0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
257e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
257f0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
25800 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
25810 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
25820 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
25830 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
25840 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
25850 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
25860 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
25870 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
25880 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
25890 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
258a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
258b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
258c0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
258d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
258e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
258f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
25910 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
25920 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
25930 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25940 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
25950 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
25960 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
25970 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
25980 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
25990 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
259a0 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
259b0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
259c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
259d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
259e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
259f0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
25a00 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
25a10 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
25a20 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
25a30 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
25a40 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
25a50 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
25a60 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
25a70 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
25a80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
25a90 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
25aa0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
25ab0 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
25ac0 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  (pPager->sync_fl
25ad0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
25ae0 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
25af0 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
25b00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
25b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25b20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
25b30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
25b40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
25b50 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
25b60 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  nalOff;.      if
25b70 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28  ( newHdr && 0==(
25b80 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
25b90 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
25ba0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
25bb0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
25bc0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
25bd0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
25be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
25bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
25c00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
25c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25c20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25c30 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
25c40 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
25c50 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73    }..  /* Unless
25c60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
25c70 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68   noSync mode, th
25c80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
25c90 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75  as just .  ** su
25ca0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
25cb0 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  d. Either way, c
25cc0 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
25cd0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
25ce0 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73   .  ** all pages
25cf0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
25d00 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
25d10 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
25d20 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  ache);.  pPager-
25d30 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
25d40 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
25d50 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
25d60 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
25d70 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r) );.  return S
25d80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25d90 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
25da0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
25db0 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
25dc0 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e   dirty pages con
25dd0 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  nected.** by the
25de0 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
25df0 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  inter. This func
25e00 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68  tion writes each
25e10 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69   one of the.** i
25e20 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69  n-memory pages i
25e30 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68  n the list to th
25e40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25e50 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   The argument ma
25e60 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65  y.** be NULL, re
25e70 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d  presenting an em
25e80 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69  pty list. In thi
25e90 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
25ea0 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tion is.** a no-
25eb0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  op..**.** The pa
25ec0 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74  ger must hold at
25ed0 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
25ee0 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73  D lock when this
25ef0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
25f00 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77  called. Before w
25f10 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  riting anything 
25f20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
25f30 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a  file, this lock.
25f40 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74  ** is upgraded t
25f50 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
25f60 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
25f70 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
25f80 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned,.** SQLITE_B
25f90 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
25fa0 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77  and no data is w
25fb0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
25fc0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
25fd0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
25fe0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
25ff0 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63  pager and the ac
26000 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d  tual file-system
26010 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   file.** is not 
26020 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20  yet open, it is 
26030 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  created and open
26040 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
26050 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  ta is .** writte
26060 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  n out..**.** Onc
26070 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
26080 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64  een upgraded and
26090 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
260a0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  the file opened,
260b0 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72  .** the pages ar
260c0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
260d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
260e0 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72  le in list order
260f0 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70  . Writing.** a p
26100 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69  age is skipped i
26110 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65  f it meets eithe
26120 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
26130 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a  ng criteria:.**.
26140 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20  **   * The page 
26150 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
26160 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  r than Pager.dbS
26170 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54  ize, or.**   * T
26180 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
26190 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ITE flag is set 
261a0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
261b0 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75  ** If writing ou
261c0 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20  t a page causes 
261d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
261e0 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72  e to grow, Pager
261f0 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69  .dbFileSize.** i
26200 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
26210 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31  ingly. If page 1
26220 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c   is written out,
26230 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
26240 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67  cached.** in Pag
26250 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
26260 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
26270 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75  tch the new valu
26280 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74  e stored in.** t
26290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
262a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
262b0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
262c0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
262d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
262e0 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
262f0 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
26300 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
26310 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
26320 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63  EXCLUSIVE lock c
26330 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61  annot.** be obta
26340 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53  ined, SQLITE_BUS
26350 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
26360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
26370 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
26380 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
26390 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a   PgHdr *pList){.
263a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
263b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
263c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
263d0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
263e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
263f0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
26400 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20  rollback pagers 
26410 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
26420 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
26430 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
26440 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
26450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
26460 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
26470 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73  ER_DBMOD );.  as
26480 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
26490 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
264a0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
264b0 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
264c0 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
264d0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
264e0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
264f0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
26500 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
26510 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
26520 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
26530 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
26540 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
26550 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
26560 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
26570 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
26580 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
26590 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
265a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
265b0 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
265c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
265d0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
265e0 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
265f0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
26600 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
26610 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
26620 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
26630 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
26640 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
26650 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
26660 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
26670 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
26680 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
26690 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
266a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
266b0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64  _OK && pPager->d
266c0 62 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  bSize>pPager->db
266d0 48 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  HintSize ){.    
266e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
266f0 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
26700 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
26710 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
26720 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
26730 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
26740 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
26750 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
26760 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
26770 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
26780 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
26790 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
267a0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
267b0 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
267c0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
267d0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
267e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
267f0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
26800 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
26810 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
26820 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
26830 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
26840 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
26850 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
26860 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
26870 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
26880 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
26890 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
268a0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
268b0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
268c0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
268d0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
268e0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
268f0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
26900 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
26910 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
26920 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
26930 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
26940 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
26950 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
26960 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
26970 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
26980 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
26990 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
269a0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
269b0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
269c0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
269d0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
269e0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
269f0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
26a00 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
26a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
26a40 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
26a50 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
26a60 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
26a70 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
26a80 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
26a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
26aa0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
26ab0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
26ac0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
26ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
26ae0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
26af0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
26b00 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
26b10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26b20 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
26b30 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
26b40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
26b50 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
26b60 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
26b70 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
26b80 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
26b90 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
26ba0 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
26bb0 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
26bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26bd0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
26be0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
26bf0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
26c00 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
26c10 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
26c20 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
26c30 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
26c40 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
26c50 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
26c60 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
26c70 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
26c80 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
26c90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26ca0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
26cb0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
26cc0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
26cd0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
26ce0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
26cf0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
26d00 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
26d10 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
26d20 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
26d30 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
26d40 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
26d50 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
26d60 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
26d70 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
26d80 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
26d90 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
26da0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
26dd0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
26de0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
26df0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
26e00 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
26e10 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
26e20 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
26e30 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
26e40 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
26e50 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
26e60 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
26e70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26e80 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
26e90 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
26ea0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
26eb0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
26ec0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
26ed0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c  _set_pagehash(pL
26ee0 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
26ef0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
26f00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
26f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
26f20 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
26f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26f40 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
26f50 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
26f60 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
26f70 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
26f80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26f90 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
26fa0 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
26fb0 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
26fc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
26fd0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
26fe0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
26ff0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
27000 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
27010 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
27020 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
27030 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27040 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27050 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
27060 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
27070 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
27080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27090 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
270a0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
270b0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
270c0 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ory ){.      sql
270d0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
270e0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
270f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27100 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
27110 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
27120 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
27130 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
27140 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
27150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27160 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
27170 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
27180 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
27190 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
271a0 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74  -journal. .** It
271b0 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
271c0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
271d0 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72  o use subjRequir
271e0 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63  esPage() to chec
271f0 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  k .** that it is
27200 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
27210 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
27220 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
27230 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27240 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
27250 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
27260 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
27270 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
27280 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
27290 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
272a0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
272b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
272c0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
272d0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
272e0 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
272f0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
27300 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
27310 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
27320 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
27330 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
27340 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
27350 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
27360 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
27370 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
27380 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
27390 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
273a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
273b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
273c0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
273d0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
273e0 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
273f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
27400 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
27410 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
27420 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
27430 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
27440 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
27450 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
27460 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
27470 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
27480 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
27490 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
274a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
274b0 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
274c0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
274d0 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
274e0 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
274f0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
27500 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
27510 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
27520 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
27530 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
27540 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
27550 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
27560 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
27570 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
27580 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
27590 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
275a0 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
275b0 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
275c0 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
275d0 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
275e0 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
275f0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
27600 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
27620 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
27630 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
27640 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  64 offset = pPag
27650 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
27660 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
27670 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
27680 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
27690 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
276a0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
276b0 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
276c0 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
276d0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
276e0 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
276f0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
27700 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
27710 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
27720 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
27730 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
27740 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
27750 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
27760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27770 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
27780 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
27790 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
277a0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
277b0 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
277c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
277d0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
277e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
277f0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
27800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27810 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
27820 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
27830 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
27840 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
27850 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
27860 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27870 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27880 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
27890 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
278a0 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
278b0 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
278c0 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
278d0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
278e0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
278f0 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
27900 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
27910 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
27920 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
27930 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
27940 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
27950 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
27960 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
27970 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
27980 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
27990 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
279a0 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
279b0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
279c0 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
279d0 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
279e0 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
279f0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
27a00 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
27a10 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
27a20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
27a30 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
27a40 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
27a50 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
27a60 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
27a70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27a80 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
27a90 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
27aa0 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
27ab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
27ac0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27ad0 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
27ae0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
27af0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
27b00 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
27b10 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
27b20 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
27b30 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
27b40 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
27b50 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
27b60 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
27b70 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
27b80 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
27b90 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
27ba0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
27bb0 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
27bc0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
27bd0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
27be0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
27bf0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
27c00 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
27c10 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
27c20 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
27c30 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
27c40 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
27c50 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
27c60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
27c70 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
27c80 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
27c90 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
27ca0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
27cb0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
27cc0 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
27cd0 63 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73  cSpill flag is s
27ce0 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
27cf0 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
27d00 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
27d10 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
27d20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
27d30 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
27d40 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
27d50 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
27d60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27d70 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
27d80 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
27d90 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
27da0 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
27db0 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
27dc0 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
27dd0 70 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69  pill flag inhibi
27de0 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
27df0 6c 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  lling regardless
27e00 20 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a   of whether.  **
27e10 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
27e20 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
27e30 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  s is set during 
27e40 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  a rollback..  **
27e50 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
27e60 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
27e70 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
27e80 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
27e90 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
27ea0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
27eb0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
27ec0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
27ed0 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20  lementaton it . 
27ee0 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
27ef0 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 43 61  e for sqlite3PCa
27f00 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
27f10 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
27f20 61 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20  ateFlag==1.  ** 
27f30 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
27f40 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
27f50 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
27f60 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
27f70 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
27f80 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
27f90 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
27fa0 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
27fb0 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
27fc0 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
27fd0 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
27fe0 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
27ff0 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
28000 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
28010 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
28020 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
28030 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
28040 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
28050 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28060 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
28070 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
28080 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   && (pPg->flags 
28090 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
280a0 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  C)!=0 ){.    ret
280b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
280c0 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
280d0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
280e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
280f0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
28100 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
28110 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
28120 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
28130 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
28140 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
28150 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
28160 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
28170 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
28180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28190 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
281a0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
281b0 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   pPg, 0, 0, 0);.
281c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
281d0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
281e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
281f0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
28200 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
28210 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
28220 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
28230 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28240 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
28250 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
28260 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
28270 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
28280 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
28290 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
282a0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
282b0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
282c0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
282d0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
282e0 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
282f0 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
28300 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
28310 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68  urnal..    ** Th
28320 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
28330 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
28340 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
28350 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
28360 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
28370 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68  write data to th
28380 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  e file in this c
28390 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ase..    **.    
283a0 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
283b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
283c0 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
283d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45    **.    **   BE
283e0 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  GIN;.    **     
283f0 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
28400 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  .    **     <mod
28410 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20  ify page X>.    
28420 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
28430 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20   sp;.    **     
28440 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61    <shrink databa
28450 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67  se file to Y pag
28460 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  es>.    **      
28470 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67   pagerStress(pag
28480 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X).    **     
28490 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
284a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
284b0 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
284c0 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
284d0 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
284e0 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
284f0 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  en.    ** out to
28500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28510 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
28520 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
28530 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
28540 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
28550 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
28560 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
28570 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
28580 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64  ll read.    ** d
28590 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
285a0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
285b0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
285c0 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
285d0 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65  t.    ** was whe
285e0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
285f0 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61  n started, not a
28600 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53  s it was when "S
28610 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20  AVEPOINT sp".   
28620 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64   ** was executed
28630 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
28640 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
28650 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
28660 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61  rent data for pa
28670 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20  ge X into the . 
28680 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61     ** sub-journa
28690 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
286a0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
286b0 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
286c0 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   it will.    ** 
286d0 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
286e0 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
286f0 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
28700 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
28710 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a     ** executed..
28720 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
28730 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63  EVER(.        rc
28740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
28750 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
28760 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
28770 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
28780 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20  .    ) ){.      
28790 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
287a0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
287b0 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
287c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
287d0 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
287e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
287f0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
28800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28810 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
28820 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
28830 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
28840 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
28850 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
28860 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
28870 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
28880 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
28890 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
288a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
288b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
288c0 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
288d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
288e0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
288f0 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
28900 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
28910 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
28920 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
28930 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a  pPager, rc); .}.
28940 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
28950 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
28960 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
28970 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
28980 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
28990 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
289a0 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
289b0 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
289c0 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
289d0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
289e0 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
289f0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
28a00 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
28a10 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
28a20 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
28a30 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
28a40 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
28a50 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
28a60 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
28a70 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
28a80 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
28a90 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
28aa0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
28ab0 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
28ac0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
28ad0 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
28ae0 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
28af0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
28b00 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
28b10 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
28b20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
28b30 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
28b40 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
28b50 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
28b60 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
28b70 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
28b80 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
28b90 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
28ba0 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
28bb0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
28bc0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
28bd0 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
28be0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
28bf0 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
28c00 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
28c10 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
28c20 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
28c30 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
28c40 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
28c50 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
28c60 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
28c70 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
28c80 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
28c90 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
28ca0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
28cb0 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
28cc0 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
28cd0 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
28ce0 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
28cf0 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
28d00 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
28d10 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
28d20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
28d30 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
28d40 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
28d50 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
28d60 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
28d70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
28d80 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
28d90 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
28da0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
28db0 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
28dc0 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
28dd0 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
28de0 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
28df0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
28e00 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
28e10 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
28e20 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
28e30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
28e40 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
28e50 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
28e60 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
28e70 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
28e80 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
28e90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
28ea0 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
28eb0 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
28ec0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
28ed0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
28ee0 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
28ef0 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
28f00 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
28f10 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
28f20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28f30 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
28f40 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
28f50 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
28f60 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
28f70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
28f80 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
28f90 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
28fa0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28fb0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
28fc0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
28fd0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
28fe0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
28ff0 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
29000 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
29010 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
29020 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
29030 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29050 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
29060 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
29070 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20   int vfsFlags,  
29080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
29090 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
290a0 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
290b0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f  .xOpen() */.  vo
290c0 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
290d0 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69  Page*) /* Functi
290e0 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69  on to reinitiali
290f0 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20  ze pages */.){. 
29100 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
29110 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
29120 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
29130 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
29140 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
29150 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29160 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
29170 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
29180 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
29190 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
291a0 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
291b0 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
291c0 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
291d0 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
291e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
291f0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
29200 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
29210 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
29220 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29230 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
29240 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
29250 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
29260 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
29270 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
29280 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
29290 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
292a0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
292b0 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
292c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
292d0 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
292e0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
292f0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
29300 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
29310 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
29320 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
29330 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
29340 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
29350 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
29360 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
29370 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
29380 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
29390 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
293a0 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
293b0 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
293c0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
293d0 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
293e0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
293f0 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
29400 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
29410 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
29420 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
29430 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
29440 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
29450 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
29460 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
29470 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
29480 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
29490 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
294a0 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
294b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
294c0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
294d0 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
294e0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
294f0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
29500 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
29510 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
29520 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
29530 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
29540 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
29550 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
29560 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
29570 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
29580 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
29590 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
295a0 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
295b0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
295c0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
295d0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
295e0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
295f0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
29600 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
29610 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
29620 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
29630 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
29640 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
29650 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
29660 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
29670 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
29680 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
29690 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
296a0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
296b0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
296c0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
296d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
296e0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
296f0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
29700 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
29710 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
29720 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
29730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
29740 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
29750 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
29760 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
29770 20 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d   1;.    zFilenam
29780 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  e = 0;.  }.#endi
29790 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
297a0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
297b0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
297c0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
297d0 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
297e0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
297f0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
29800 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
29810 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
29820 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
29830 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
29840 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
29850 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
29860 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
29870 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
29880 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
29890 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
298a0 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
298b0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
298c0 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
298d0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
298e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
298f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
29900 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68  .    }.    zPath
29910 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
29920 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
29930 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
29940 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
29950 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ls */.    rc = s
29960 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
29970 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
29980 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
29990 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
299a0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
299b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
299c0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
299d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
299e0 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
299f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
29a00 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
29a10 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
29a20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
29a30 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
29a40 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
29a50 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
29a60 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
29a70 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
29a80 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
29a90 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
29aa0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
29ab0 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
29ac0 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
29ad0 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
29ae0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
29af0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
29b00 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
29b10 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
29b20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
29b30 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
29b40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
29b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
29b60 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
29b70 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
29b80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29b90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
29ba0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
29bb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
29bc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
29bd0 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
29be0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
29bf0 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
29c00 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
29c10 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
29c20 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
29c30 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
29c40 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
29c50 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
29c60 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
29c70 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
29c80 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
29c90 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
29cb0 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
29cc0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
29cd0 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
29cf0 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
29d00 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
29d10 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
29d20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
29d30 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
29d40 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
29d50 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
29d60 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
29d70 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
29d80 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
29d90 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
29da0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
29db0 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
29dc0 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
29dd0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
29de0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
29df0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
29e00 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
29e10 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
29e20 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
29e30 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
29e40 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
29e50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
29e60 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
29e70 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
29e80 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
29e90 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
29ea0 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
29eb0 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
29ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
29ed0 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
29ee0 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
29ef0 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
29f00 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
29f10 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
29f20 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
29f30 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
29f40 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
29f50 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
29f60 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  hname + 1 +     
29f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
29f80 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
29f90 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31  Pathname + 8 + 1
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29fb0 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
29fc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29fd0 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
29fe0 6e 61 6d 65 20 2b 20 34 20 2b 20 31 20 20 20 20  name + 4 + 1    
29ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61            /* zWa
2a000 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b  l */.#endif.  );
2a010 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2a020 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2a030 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2a040 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
2a050 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
2a060 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
2a070 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
2a080 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2a090 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2a0a0 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
2a0b0 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
2a0c0 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
2a0d0 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
2a0e0 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
2a0f0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2a100 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
2a110 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
2a120 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2a130 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
2a140 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
2a150 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
2a160 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2a170 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
2a180 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
2a190 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
2a1a0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2a1b0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2a1c0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
2a1d0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
2a1e0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
2a1f0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2a200 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2a210 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2a220 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2a230 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2a240 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
2a250 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
2a260 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
2a270 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2a280 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
2a290 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61  .    assert( nPa
2a2a0 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20  thname>0 );.    
2a2b0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2a2c0 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
2a2d0 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
2a2e0 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   1);.    memcpy(
2a2f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2a300 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
2a310 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2a320 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
2a330 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
2a340 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2a350 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2a360 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2a370 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
2a380 22 2c 20 38 29 3b 0a 23 69 66 6e 64 65 66 20 53  ", 8);.#ifndef S
2a390 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2a3a0 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2a3b0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2a3c0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2a3d0 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2a3e0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2a3f0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2a400 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2a410 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2a420 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c  thname], "-wal",
2a430 20 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   4);.#endif.    
2a440 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
2a450 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
2a460 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
2a470 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
2a480 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
2a490 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
2a4a0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
2a4b0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2a4c0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2a4d0 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f  0] ){.    int fo
2a4e0 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
2a4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
2a500 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  S flags returned
2a510 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   by xOpen() */. 
2a520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a530 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2a540 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2a550 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c  Pager->fd, vfsFl
2a560 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
2a570 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20   assert( !memDb 
2a580 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  );.    readOnly 
2a590 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
2a5a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
2a5b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
2a5c0 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
2a5d0 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
2a5e0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
2a5f0 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20  ,.    ** choose 
2a600 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
2a610 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
2a620 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
2a630 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2a640 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
2a650 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
2a660 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
2a670 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2a680 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
2a690 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
2a6a0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
2a6b0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
2a6c0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
2a6d0 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  ize().    **    
2a6e0 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
2a6f0 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
2a700 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
2a710 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  ically..    */. 
2a720 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a730 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
2a740 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65  y ){.      setSe
2a750 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2a760 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53  ;.      assert(S
2a770 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2a780 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
2a790 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2a7a0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
2a7b0 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2a7c0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2a7d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2a7e0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2a7f0 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
2a800 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
2a810 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
2a820 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2a830 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2a840 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  _SIZE;.        }
2a850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a860 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33  szPageDflt = (u3
2a870 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  2)pPager->sector
2a880 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
2a890 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2a8a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2a8b0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2a8c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  {.        int iD
2a8d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
2a8e0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2a8f0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
2a900 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
2a910 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2a920 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2a930 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
2a940 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2a950 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2a960 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
2a970 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
2a980 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
2a990 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2a9a0 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
2a9b0 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65     for(ii=szPage
2a9c0 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Dflt; ii<=SQLITE
2a9d0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2a9e0 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
2a9f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2aa00 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2aa10 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2aa20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2aa30 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
2aa40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2aa50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2aa60 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
2aa70 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2aa80 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2aa90 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
2aaa0 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
2aab0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2aac0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2aad0 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
2aae0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2aaf0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
2ab00 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
2ab10 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
2ab20 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
2ab30 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
2ab40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2ab50 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
2ab60 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
2ab70 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
2ab80 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
2ab90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2aba0 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
2abb0 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
2abc0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
2abd0 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
2abe0 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
2abf0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
2ac00 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20  journal..    */ 
2ac10 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
2ac20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
2ac30 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
2ac40 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72  ADER;.    pPager
2ac50 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53  ->eLock = EXCLUS
2ac60 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  IVE_LOCK;.    re
2ac70 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
2ac80 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
2ac90 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
2aca0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2acb0 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
2acc0 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
2acd0 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
2ace0 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
2acf0 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
2ad00 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
2ad10 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
2ad20 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
2ad30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ad40 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2ad50 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
2ad60 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
2ad70 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
2ad80 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
2ad90 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
2ada0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
2adb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2adc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
2add0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2ade0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
2adf0 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
2ae00 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
2ae10 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
2ae20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
2ae30 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
2ae40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ae50 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2ae60 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20  >pTmpSpace );.  
2ae70 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2ae80 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2ae90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2aea0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
2aeb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2aec0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2aed0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
2aee0 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  /.  assert( nExt
2aef0 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78  ra<1000 );.  nEx
2af00 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2af10 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
2af20 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
2af30 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
2af40 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
2af50 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
2af60 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
2af70 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
2af80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2af90 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
2afa0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
2afb0 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
2afc0 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
2afd0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
2afe0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
2aff0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
2b000 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
2b010 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
2b020 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
2b030 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
2b040 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
2b050 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63  ock = (noReadloc
2b060 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f  k && readOnly) ?
2b070 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  1:0;.  /* pPager
2b080 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2b090 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2b0a0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2b0b0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2b0c0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2b0d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2b0e0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2b0f0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2b100 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2b110 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2b120 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2b130 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2b140 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2b150 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2b160 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2b170 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
2b180 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2b190 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
2b1a0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
2b1b0 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
2b1c0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   );.#endif.  /* 
2b1d0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2b1e0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2b1f0 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
2b200 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
2b210 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
2b220 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b230 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
2b240 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
2b250 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b260 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2b270 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2b280 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2b290 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
2b2a0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2b2b0 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
2b2c0 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
2b2d0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2b2e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2b2f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
2b300 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
2b310 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2b320 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
2b330 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
2b340 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
2b350 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2b360 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
2b370 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2b380 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
2b390 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  lSync = pPager->
2b3a0 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70  noSync ?0:1;.  p
2b3b0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
2b3c0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2b3d0 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
2b3e0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2b3f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2b400 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
2b410 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2b420 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
2b430 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
2b440 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
2b450 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
2b460 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
2b470 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
2b480 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
2b490 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2b4a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2b4b0 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
2b4c0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2b4d0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
2b4e0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
2b4f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2b500 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2b510 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
2b520 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
2b530 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2b540 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2b550 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2b560 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
2b570 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
2b580 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
2b590 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
2b5a0 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
2b5b0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
2b5c0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
2b5d0 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2b5e0 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2b5f0 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2b600 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  h)); */..  *ppPa
2b610 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
2b620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b630 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
2b640 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2b650 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2b660 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2b670 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2b680 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2b690 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2b6a0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2b6b0 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2b6c0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2b6d0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2b6e0 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2b6f0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2b700 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2b710 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2b720 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2b730 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2b740 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2b750 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2b760 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2b770 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2b780 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2b790 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2b7a0 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2b7b0 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2b7c0 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2b7d0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2b7e0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2b7f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2b800 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2b810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2b820 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2b830 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2b840 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2b850 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2b860 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b870 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2b880 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2b890 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2b8a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2b8b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2b8c0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2b8d0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2b8e0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2b8f0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2b900 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2b910 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2b920 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2b930 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2b940 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2b950 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2b960 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2b970 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2b980 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2b990 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2b9a0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2b9b0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2b9c0 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2b9d0 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2b9e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2b9f0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2ba00 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2ba10 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2ba20 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2ba30 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2ba40 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2ba50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2ba60 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2ba70 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2ba80 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2ba90 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2baa0 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2bab0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2bac0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2bad0 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2bae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2baf0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2bb00 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2bb10 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2bb20 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2bb30 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2bb40 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2bb50 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2bb60 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2bb70 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2bb80 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2bb90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2bba0 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2bbb0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2bbc0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2bbd0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2bbe0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2bbf0 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2bc00 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2bc10 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2bc20 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2bc30 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2bc40 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2bc50 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2bc60 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2bc70 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2bc80 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2bc90 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2bca0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2bcb0 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2bcc0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2bcd0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2bce0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2bcf0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2bd00 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2bd10 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2bd20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2bd30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2bd40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2bd50 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2bd60 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2bd70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2bd80 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2bd90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2bda0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2bdb0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2bdc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2bdd0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2bde0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2bdf0 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2be00 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2be10 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2be20 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2be30 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2be40 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2be50 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2be60 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2be70 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2be80 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2be90 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2bea0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2beb0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2bec0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2bed0 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2bee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bef0 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2bf00 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bf20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2bf30 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2bf40 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2bf50 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2bf60 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2bf70 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2bf80 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2bf90 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2bfa0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2bfb0 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2bfc0 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2bfd0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2bfe0 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2bff0 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2c000 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2c010 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2c020 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2c030 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2c040 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2c050 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2c060 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2c070 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2c080 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2c090 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2c0a0 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2c0b0 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2c0c0 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2c0d0 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2c0e0 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2c0f0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2c100 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2c110 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2c120 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2c130 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2c140 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2c150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c160 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2c170 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2c180 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2c190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c1a0 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2c1b0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c1d0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2c1e0 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2c1f0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43  e */..      /* C
2c200 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66  heck the size of
2c210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c220 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73  le. If it consis
2c230 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20  ts of 0 pages,. 
2c240 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c       ** then del
2c250 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2c260 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65  file. See the he
2c270 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f  ader comment abo
2c280 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  ve for .      **
2c290 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68   the reasoning h
2c2a0 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ere.  Delete the
2c2b0 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
2c2c0 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20  l file under.   
2c2d0 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44     ** a RESERVED
2c2e0 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72   lock to avoid r
2c2f0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ace conditions a
2c300 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c  nd to avoid viol
2c310 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b  ating.      ** [
2c320 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a  H33020]..      *
2c330 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
2c340 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2c350 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2c360 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c380 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
2c390 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c3a0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
2c3b0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
2c3c0 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
2c3d0 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
2c3e0 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
2c3f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2c400 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
2c410 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2c420 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
2c430 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2c440 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2c450 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
2c460 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
2c470 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2c480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c490 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2c4a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2c4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c4c0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
2c4d0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2c4e0 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
2c4f0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
2c500 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
2c510 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
2c520 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2c530 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
2c540 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
2c550 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
2c560 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
2c570 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
2c580 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2c590 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
2c5a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
2c5b0 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
2c5c0 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
2c5d0 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
2c5e0 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
2c5f0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
2c600 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
2c610 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2c620 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2c630 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
2c640 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2c650 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
2c660 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2c670 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2c680 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2c690 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2c6a0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2c6b0 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
2c6c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c6d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c6e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c6f0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
2c700 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2c710 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2c720 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
2c730 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
2c740 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2c750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c760 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
2c770 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
2c780 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c790 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
2c7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c7b0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c7d0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2c7e0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
2c7f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c800 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
2c810 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
2c820 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2c830 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
2c840 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
2c850 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
2c860 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
2c870 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
2c880 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
2c890 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
2c8a0 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
2c8b0 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
2c8c0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
2c8d0 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
2c8f0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
2c900 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
2c910 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
2c920 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
2c930 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
2c940 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
2c950 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
2c960 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
2c970 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
2c980 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
2c990 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
2c9a0 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
2c9b0 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
2c9c0 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
2c9d0 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
2c9e0 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
2c9f0 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
2ca00 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
2ca10 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
2ca20 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
2ca30 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
2ca40 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
2ca50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
2ca60 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
2ca70 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
2ca80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2caa0 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
2cab0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cac0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2cad0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2cae0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2caf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2cb00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2cb10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2cb20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
2cb30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2cb40 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
2cb50 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
2cb60 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2cb70 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
2cb80 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
2cb90 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
2cba0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
2cbb0 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
2cbc0 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
2cbd0 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
2cbe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2cbf0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
2cc00 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
2cc10 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
2cc20 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
2cc30 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
2cc40 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2cc50 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
2cc60 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
2cc70 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
2cc80 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
2cc90 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
2cca0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
2ccb0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2ccc0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
2ccd0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
2cce0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2ccf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
2cd00 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
2cd10 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
2cd20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
2cd30 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
2cd40 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
2cd50 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
2cd60 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
2cd70 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
2cd80 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
2cd90 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
2cda0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
2cdb0 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
2cdc0 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
2cdd0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
2cde0 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
2cdf0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
2ce00 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
2ce10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ce20 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
2ce30 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
2ce40 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
2ce50 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
2ce60 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
2ce70 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
2ce80 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2ce90 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
2cea0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
2ceb0 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
2cec0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2ced0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
2cee0 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
2cef0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
2cf00 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
2cf10 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
2cf20 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
2cf30 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
2cf40 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
2cf50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2cf60 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
2cf70 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
2cf80 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
2cf90 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
2cfa0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2cfb0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2cfc0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2cfd0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2cfe0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
2cff0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
2d000 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
2d010 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2d020 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
2d030 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
2d040 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
2d050 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2d060 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2d070 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
2d080 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
2d090 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2d0a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d0c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d0d0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2d0e0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
2d0f0 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
2d100 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
2d110 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
2d120 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
2d130 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
2d140 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
2d150 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
2d160 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
2d170 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
2d180 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
2d190 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2d1a0 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
2d1b0 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
2d1c0 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
2d1d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
2d1e0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2d1f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
2d200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
2d210 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2d220 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
2d230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2d240 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2d250 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2d260 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
2d270 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
2d280 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2d290 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
2d2a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2d2b0 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
2d2c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2d2d0 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
2d2e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2d2f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
2d300 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
2d310 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d320 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
2d330 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
2d340 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
2d350 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
2d360 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2d370 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20  oReadlock==0 || 
2d380 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2d390 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   );..    if( pPa
2d3a0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d  ger->noReadlock=
2d3b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2d3c0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
2d3d0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
2d3e0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2d3f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d400 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
2d410 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
2d420 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
2d430 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
2d440 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
2d450 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2d460 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
2d470 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
2d480 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2d490 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
2d4a0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
2d4b0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
2d4c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
2d4d0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
2d4e0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2d4f0 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
2d500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2d510 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
2d520 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
2d530 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
2d540 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
2d550 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
2d560 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2d570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d580 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2d590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
2d5a0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
2d5b0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
2d5c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2d5d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d5e0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
2d5f0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
2d600 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
2d610 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
2d620 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
2d630 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
2d640 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
2d650 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
2d660 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
2d670 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
2d680 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2d690 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
2d6a0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
2d6b0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
2d6c0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
2d6d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2d6e0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
2d6f0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
2d700 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
2d710 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
2d720 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
2d730 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
2d740 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
2d750 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
2d760 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
2d770 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
2d780 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
2d790 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
2d7a0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
2d7b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d7c0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
2d7d0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
2d7e0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
2d7f0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
2d800 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
2d810 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
2d820 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2d830 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
2d840 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
2d850 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
2d860 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
2d870 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
2d880 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
2d890 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
2d8a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
2d8b0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
2d8c0 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
2d8d0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2d8e0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
2d8f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
2d900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d920 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2d930 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
2d940 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
2d950 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
2d960 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
2d970 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
2d980 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
2d990 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
2d9a0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
2d9b0 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
2d9c0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
2d9d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
2d9e0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
2d9f0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
2da00 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
2da10 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
2da20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
2da30 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
2da40 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
2da50 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
2da60 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
2da70 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
2da80 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
2da90 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
2daa0 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
2dab0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
2dac0 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
2dad0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
2dae0 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
2daf0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
2db00 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2db10 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
2db20 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
2db30 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
2db40 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
2db50 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
2db60 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
2db70 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
2db80 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
2db90 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
2dba0 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
2dbb0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
2dbc0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
2dbd0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
2dbe0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
2dbf0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
2dc00 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
2dc10 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2dc20 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
2dc30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2dc40 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
2dc50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2dc60 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2dc70 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2dc80 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
2dc90 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2dca0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
2dcb0 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
2dcc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2dcd0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2dce0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
2dcf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2dd00 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
2dd10 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
2dd20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2dd30 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2dd40 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
2dd50 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
2dd60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2dd70 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
2dd80 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
2dd90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2dda0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
2ddb0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2ddc0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2ddd0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2dde0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2ddf0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
2de00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2de10 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2de20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2de30 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2de40 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
2de50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
2de60 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2de70 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2de80 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2de90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dea0 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
2deb0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
2dec0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2ded0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2dee0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2def0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2df00 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2df10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2df20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
2df30 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
2df40 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
2df50 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
2df60 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
2df70 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
2df80 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
2df90 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
2dfa0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
2dfb0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
2dfc0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
2dfd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
2dfe0 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
2dff0 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
2e000 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
2e010 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
2e020 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
2e030 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
2e040 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
2e050 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
2e060 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
2e070 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
2e080 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
2e090 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
2e0a0 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
2e0b0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
2e0c0 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
2e0d0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
2e0e0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
2e0f0 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
2e100 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
2e110 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2e120 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2e130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e140 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2e150 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
2e160 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2e170 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2e180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e190 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2e1a0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2e1b0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
2e1c0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2e1d0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
2e1e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2e1f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2e200 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
2e210 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
2e220 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2e230 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2e240 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
2e250 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e260 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2e270 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
2e280 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2e290 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2e2a0 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
2e2b0 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
2e2c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
2e2d0 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
2e2e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
2e2f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2e300 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
2e310 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
2e320 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
2e330 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
2e340 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
2e350 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
2e360 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
2e370 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
2e380 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
2e390 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
2e3a0 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
2e3b0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
2e3c0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
2e3d0 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
2e3e0 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
2e3f0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
2e400 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
2e410 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
2e420 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
2e430 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
2e440 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
2e450 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
2e460 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
2e470 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
2e480 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
2e490 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
2e4a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
2e4b0 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
2e4c0 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
2e4d0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
2e4e0 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
2e4f0 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
2e500 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
2e510 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
2e520 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
2e530 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
2e540 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
2e550 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2e560 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
2e570 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
2e580 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
2e590 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
2e5a0 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
2e5b0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
2e5c0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
2e5d0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
2e5e0 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
2e5f0 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
2e600 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
2e610 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
2e620 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
2e630 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
2e640 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2e650 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2e660 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
2e670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2e680 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2e690 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
2e6a0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
2e6b0 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
2e6c0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
2e6d0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
2e6e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
2e6f0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
2e700 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
2e710 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2e720 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2e730 69 6c 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ile .     && (pP
2e740 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c  ager->pBackup ||
2e750 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
2e760 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
2e770 70 50 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20  pPCache)>0) .   
2e780 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2e790 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
2e7a0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
2e7b0 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
2e7c0 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
2e7d0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
2e7e0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
2e7f0 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
2e800 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
2e810 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
2e820 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
2e830 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
2e840 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
2e850 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
2e860 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
2e870 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
2e880 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
2e890 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
2e8a0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
2e8b0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
2e8c0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
2e8d0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
2e8e0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
2e8f0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
2e900 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
2e910 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
2e920 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
2e930 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
2e940 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
2e950 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
2e960 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
2e970 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
2e980 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
2e990 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
2e9a0 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
2e9b0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
2e9c0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
2e9d0 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
2e9e0 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
2e9f0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
2ea00 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
2ea10 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
2ea20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
2ea30 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
2ea40 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
2ea50 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
2ea60 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
2ea70 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
2ea80 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
2ea90 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
2eaa0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20     Pgno nPage = 
2eab0 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
2eac0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
2ead0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2eae0 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  rs)];..      rc 
2eaf0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
2eb00 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2eb10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2eb20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20   goto failed;.. 
2eb30 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
2eb40 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
2eb50 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
2eb60 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
2eb70 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2eb80 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
2eb90 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2eba0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
2ebb0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
2ebc0 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
2ebd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2ebe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ebf0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
2ec00 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
2ec10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ec20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
2ec30 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
2ec40 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
2ec50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2ec60 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
2ec70 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
2ec80 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
2ec90 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
2eca0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
2ecb0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
2ecc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2ecd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2ece0 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
2ecf0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2ed00 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
2ed10 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
2ed20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
2ed30 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
2ed40 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
2ed50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
2ed60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2ed70 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
2ed80 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64  t(pPager);.#ifnd
2ed90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2eda0 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  AL.    assert( p
2edb0 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c  Pager->pWal==0 |
2edc0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2edd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
2ede0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2edf0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2ee00 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2ee10 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
2ee20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
2ee30 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
2ee40 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
2ee50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2ee60 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
2ee70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ee80 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2ee90 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2eea0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2eeb0 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
2eec0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2eed0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2eee0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
2eef0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
2ef00 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
2ef10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2ef20 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2ef30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2ef40 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2ef50 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a  GER_READER;.  }.
2ef60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ef70 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
2ef80 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
2ef90 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
2efa0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
2efb0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
2efc0 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
2efd0 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
2efe0 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
2eff0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
2f000 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
2f010 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
2f020 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
2f030 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
2f040 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
2f050 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
2f060 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
2f070 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
2f080 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2f090 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
2f0a0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
2f0b0 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
2f0c0 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
2f0d0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
2f0e0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2f0f0 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
2f100 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
2f110 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
2f120 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
2f130 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
2f140 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
2f150 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
2f160 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
2f170 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
2f180 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
2f190 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
2f1a0 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
2f1b0 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
2f1c0 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
2f1d0 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
2f1e0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f1f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
2f200 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
2f210 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
2f220 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
2f230 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
2f240 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
2f250 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
2f260 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
2f270 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
2f280 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
2f290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2f2a0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
2f2b0 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
2f2c0 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
2f2d0 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
2f2e0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
2f2f0 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
2f300 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
2f310 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
2f320 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2f330 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
2f340 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
2f350 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
2f360 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
2f370 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
2f380 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
2f390 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
2f3a0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
2f3b0 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
2f3c0 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
2f3d0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
2f3e0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2f3f0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
2f400 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
2f410 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
2f420 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
2f430 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
2f440 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
2f450 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2f460 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
2f470 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
2f480 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
2f490 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
2f4a0 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
2f4b0 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
2f4c0 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
2f4d0 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
2f4e0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
2f4f0 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
2f500 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
2f510 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
2f520 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
2f530 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
2f540 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
2f550 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
2f560 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
2f570 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
2f580 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
2f590 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
2f5a0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
2f5b0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
2f5c0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
2f5d0 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
2f5e0 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65   in two seperate
2f5f0 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
2f600 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
2f610 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
2f620 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
2f630 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
2f640 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
2f650 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
2f660 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
2f670 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
2f680 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
2f690 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
2f6a0 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
2f6b0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
2f6c0 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
2f6d0 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
2f6e0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
2f6f0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
2f700 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2f710 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
2f720 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
2f730 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
2f740 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
2f750 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
2f760 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
2f770 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
2f780 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
2f790 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
2f7a0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
2f7b0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2f7c0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2f7d0 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
2f7e0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
2f7f0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
2f800 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
2f810 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
2f820 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
2f830 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
2f840 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
2f850 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
2f860 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
2f870 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
2f880 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
2f890 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
2f8a0 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
2f8b0 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
2f8c0 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
2f8d0 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
2f8e0 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
2f8f0 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
2f900 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
2f910 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
2f920 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2f930 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
2f940 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
2f950 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2f960 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
2f970 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
2f980 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
2f990 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
2f9a0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
2f9b0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
2f9c0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
2f9d0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2f9e0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
2f9f0 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
2fa00 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
2fa10 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
2fa20 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
2fa30 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
2fa40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
2fa50 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
2fa60 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
2fa70 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
2fa80 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
2fa90 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
2faa0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
2fab0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
2fac0 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
2fad0 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
2fae0 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
2faf0 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
2fb00 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
2fb10 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
2fb20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
2fb30 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
2fb40 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
2fb50 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
2fb60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2fb70 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
2fb80 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
2fb90 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
2fba0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
2fbb0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
2fbc0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
2fbd0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
2fbe0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
2fbf0 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
2fc00 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
2fc10 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
2fc20 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
2fc30 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2fc40 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
2fc50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2fc60 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
2fc70 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
2fc80 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2fc90 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
2fca0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
2fcb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2fcc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fcd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2fce0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
2fcf0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
2fd00 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
2fd10 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
2fd20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
2fd30 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
2fd40 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
2fd50 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
2fd60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
2fd70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fd80 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
2fd90 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
2fda0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fdb0 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
2fdc0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
2fdd0 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  , 1, ppPage);.  
2fde0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
2fdf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
2fe00 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
2fe10 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
2fe20 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
2fe30 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
2fe40 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
2fe50 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
2fe60 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
2fe70 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2fe80 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
2fe90 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
2fea0 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
2feb0 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
2fec0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
2fed0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
2fee0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
2fef0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
2ff00 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
2ff10 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
2ff20 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
2ff30 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28  ger==pPager || (
2ff40 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
2ff50 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a  ==0 );..  if( (*
2ff60 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20  ppPage)->pPager 
2ff70 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
2ff80 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
2ff90 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
2ffa0 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
2ffb0 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
2ffc0 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
2ffd0 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
2ffe0 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
2fff0 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
30000 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
30010 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
30020 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
30030 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
30040 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
30050 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65  r->nHit);.    re
30060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
30080 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
30090 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
300a0 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
300b0 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
300c0 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
300d0 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 50  ized.  */..    P
300e0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
300f0 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50  ->nMiss);.    pP
30100 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20  g = *ppPage;.   
30110 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
30120 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
30130 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
30140 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
30150 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
30160 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
30170 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
30180 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
30190 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
301a0 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
301b0 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
301c0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
301d0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
301e0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
301f0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
30200 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30210 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30220 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
30230 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
30240 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
30250 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
30260 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
30270 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
30280 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
30290 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
302a0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
302b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
302c0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
302d0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
302e0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
302f0 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
30300 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
30310 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
30320 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
30330 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
30340 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
30350 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
30360 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
30370 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
30380 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
30390 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
303a0 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
303b0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
303c0 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
303d0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
303e0 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
303f0 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
30400 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
30410 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
30420 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
30430 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
30440 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
30450 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
30460 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
30470 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
30480 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
30490 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
304a0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
304b0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
304c0 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
304d0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
304e0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
304f0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
30500 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
30510 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
30520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
30530 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
30540 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
30550 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
30560 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
30570 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
30580 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
30590 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
305a0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
305b0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
305c0 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
305d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
305e0 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
305f0 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
30600 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
30610 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
30620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
30630 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
30640 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  );.      rc = re
30650 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
30660 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30680 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
30690 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
306a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
306b0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
306c0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
306d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
306e0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
306f0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
30700 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
30710 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
30720 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
30730 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
30740 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
30750 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
30760 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
30770 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
30780 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
30790 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
307a0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
307b0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
307c0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
307d0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
307e0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
307f0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
30800 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
30810 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
30820 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
30830 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
30840 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
30850 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
30860 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
30870 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
30880 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
30890 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
308a0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
308b0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
308c0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
308d0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
308e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
308f0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
30900 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
30910 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
30920 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
30930 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
30940 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
30950 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
30960 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
30970 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
30980 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
30990 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
309a0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
309b0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
309c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
309d0 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
309e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
309f0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
30a00 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
30a10 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
30a20 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  RROR );.  sqlite
30a30 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
30a40 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
30a50 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
30a60 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
30a70 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
30a80 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
30a90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
30aa0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
30ab0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
30ac0 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
30ad0 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
30ae0 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
30af0 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
30b00 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
30b10 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
30b20 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
30b30 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
30b40 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
30b50 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
30b60 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
30b70 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
30b80 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
30b90 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
30ba0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
30bb0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
30bc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
30bd0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
30be0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
30bf0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
30c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
30c10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30c20 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
30c30 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
30c40 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
30c50 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
30c60 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
30c70 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
30c80 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30c90 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
30ca0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
30cb0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
30cc0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
30cd0 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
30ce0 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
30cf0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
30d00 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
30d10 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
30d20 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
30d30 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
30d40 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
30d50 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
30d60 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
30d70 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
30d80 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
30d90 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
30da0 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
30db0 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
30dc0 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
30dd0 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
30de0 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
30df0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
30e00 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
30e10 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
30e20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
30e30 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
30e40 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
30e50 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
30e60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
30e70 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
30e80 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
30e90 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
30ea0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
30eb0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
30ec0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
30ed0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
30ee0 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
30ef0 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
30f00 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
30f10 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
30f20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
30f30 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
30f40 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
30f50 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
30f60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
30f70 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
30f80 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
30f90 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
30fa0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
30fb0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
30fc0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
30fd0 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
30fe0 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
30ff0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
31000 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
31010 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
31020 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
31030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31040 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
31050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
31060 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
31070 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
31080 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
31090 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
310a0 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
310b0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
310c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
310d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
310e0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
310f0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
31100 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
31110 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
31120 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
31130 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
31140 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
31150 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
31160 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
31170 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
31180 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
31190 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
311a0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
311b0 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
311c0 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
311d0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
311e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
311f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
31200 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
31210 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
31220 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
31230 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
31240 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
31250 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
31260 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
31270 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
31280 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
31290 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
312a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
312b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
312c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
312d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
312e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
312f0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
31300 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
31310 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
31320 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
31330 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31340 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
31350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
31360 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31370 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
31380 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
31390 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
313a0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
313b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
313c0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
313d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313e0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
313f0 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
31400 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
31410 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
31420 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
31430 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
31440 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
31450 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
31460 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
31470 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
31480 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
31490 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
314a0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
314b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
314c0 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  AL).          );
314d0 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
314e0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
314f0 52 49 54 45 0a 20 20 20 20 20 20 20 20 72 63 20  RITE.        rc 
31500 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
31510 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
31520 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
31530 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31540 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
31550 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
31560 67 65 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  ger).        );.
31570 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20    #else.        
31580 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
31590 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
315a0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
315b0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
315c0 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20  );.  #endif.    
315d0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
315e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
315f0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
31600 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a  ->jfd) );.    }.
31610 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69    .  .    /* Wri
31620 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
31630 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
31640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31650 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a  and open .    **
31660 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
31670 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
31680 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
31690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
316a0 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
316b0 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
316c0 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
316d0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
316e0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
316f0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
31700 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
31710 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
31720 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
31730 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
31740 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
31750 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
31760 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
31770 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
31780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31790 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
317a0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
317b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
317c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
317d0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
317e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
317f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
31800 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
31810 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61  OCKED );.    pPa
31820 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
31830 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
31840 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MOD;.  }..  retu
31850 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
31860 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
31870 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
31880 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
31890 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
318a0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
318b0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
318c0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
318d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
318e0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
318f0 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
31900 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
31910 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
31920 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
31930 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
31940 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
31950 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
31960 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
31970 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
31980 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
31990 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
319a0 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
319b0 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
319c0 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
319d0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
319e0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
319f0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
31a00 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
31a10 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
31a20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
31a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
31a40 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
31a50 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
31a60 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
31a70 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
31a80 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
31a90 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
31aa0 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
31ab0 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
31ac0 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
31ad0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
31ae0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
31af0 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
31b00 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
31b10 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
31b20 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
31b30 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
31b40 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
31b50 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
31b60 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
31b70 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
31b80 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
31b90 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
31ba0 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
31bb0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
31bc0 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
31bd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
31be0 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
31bf0 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
31c00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31c10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
31c20 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
31c30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
31c40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31c50 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
31c60 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
31c70 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
31c80 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65  ERROR );.  pPage
31c90 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
31ca0 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
31cb0 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  ry;..  if( ALWAY
31cc0 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  S(pPager->eState
31cd0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20  ==PAGER_READER) 
31ce0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
31cf0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
31d00 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  l==0 );..    if(
31d10 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
31d20 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
31d30 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
31d40 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
31d50 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  se locking_mode=
31d60 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61  exclusive, and a
31d70 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75  n.      ** exclu
31d80 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
31d90 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
31da0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
31db0 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20  btain it now..  
31dc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
31dd0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
31de0 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
31df0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
31e00 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
31e10 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
31e20 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
31e30 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
31e40 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
31e50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31e60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31e70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
31e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
31e90 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
31ea0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
31eb0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
31ec0 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
31ed0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
31ee0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
31ef0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
31f00 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
31f10 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
31f20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
31f30 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
31f40 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
31f50 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
31f60 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
31f70 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
31f80 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
31f90 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
31fa0 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
31fb0 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
31fc0 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
31fd0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
31fe0 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
31ff0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32000 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
32010 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32020 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
32030 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
32040 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
32050 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32060 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
32070 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
32080 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
32090 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
320a0 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
320b0 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
320c0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
320d0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
320e0 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
320f0 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
32100 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
32110 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
32120 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
32130 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
32140 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
32150 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32160 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
32170 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
32180 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
32190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
321a0 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   && exFlag ){.  
321b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
321c0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
321d0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
321e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
321f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
32200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32210 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
32220 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
32230 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
32240 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
32250 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
32260 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
32270 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
32280 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
32290 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
322a0 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
322b0 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
322c0 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
322d0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
322e0 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
322f0 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
32300 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
32310 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
32320 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
32330 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
32340 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
32350 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
32360 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
32370 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
32380 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
32390 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
323a0 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
323b0 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
323c0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
323d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
323e0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
323f0 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
32400 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
32410 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
32420 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
32430 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
32440 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
32450 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
32460 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
32470 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
32480 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
32490 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
324a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
324b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
324c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
324d0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
324e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
324f0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
32500 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32510 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
32520 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
32530 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
32540 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
32550 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
32560 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
32570 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
32580 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
32590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
325a0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61  a single data pa
325b0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
325c0 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
325d0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
325e0 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f  * main journal o
325f0 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73  r sub-journal as
32600 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68   required. If th
32610 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
32620 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66  n into.** one of
32630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   the journals, t
32640 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
32650 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
32660 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  he .** Pager.pIn
32670 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61  Journal bitvec a
32680 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
32690 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
326a0 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66  nt bitvecs.** of
326b0 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f   any open savepo
326c0 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69  ints as appropri
326d0 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
326e0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
326f0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
32700 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
32710 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
32720 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
32730 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
32740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
32750 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
32760 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e  is not called un
32770 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61  less a write-tra
32780 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
32790 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20  eady .  ** been 
327a0 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75  started. The jou
327b0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72  rnal file may or
327c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
327d0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
327e0 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72    ** It is never
327f0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45   called in the E
32800 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f  RROR state..  */
32810 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
32820 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32830 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
32840 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
32850 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
32860 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
32870 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
32880 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
32890 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
328a0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
328b0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
328c0 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  ager) );..  /* I
328d0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62  f an error has b
328e0 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64  een previously d
328f0 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20  etected, report 
32900 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20  the same error. 
32910 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20   ** again. This 
32920 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65  should not happe
32930 6e 2c 20 62 75 74 20 74 68 65 20 63 68 65 63 6b  n, but the check
32940 20 70 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74   provides robust
32950 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
32960 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
32970 43 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20  Code) )  return 
32980 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
32990 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65  ..  /* Higher-le
329a0 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76  vel routines nev
329b0 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  er call this fun
329c0 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73  ction if databas
329d0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72  e is not.  ** wr
329e0 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65  itable.  But che
329f0 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20  ck anyway, just 
32a00 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  for robustness. 
32a10 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
32a20 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29  Pager->readOnly)
32a30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
32a40 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f  _PERM;..  CHECK_
32a50 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
32a60 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
32a70 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70  e needs to be op
32a80 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76  ened. Higher lev
32a90 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  el routines have
32aa0 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62   already.  ** ob
32ab0 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73  tained the neces
32ac0 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65  sary locks to be
32ad0 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72  gin the write-tr
32ae0 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74  ansaction, but t
32af0 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  he.  ** rollback
32b00 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
32b10 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20  ot yet be open. 
32b20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74  Open it now if t
32b30 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
32b40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
32b50 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63  is done before c
32b60 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63  alling sqlite3Pc
32b70 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20  acheMakeDirty() 
32b80 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20  on the page. .  
32b90 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
32ba0 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66   it were done af
32bb0 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  ter calling sqli
32bc0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
32bd0 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ty(), then.  ** 
32be0 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f  an error might o
32bf0 63 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67  ccur and the pag
32c00 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20  er would end up 
32c10 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  in WRITER_LOCKED
32c20 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68   state.  ** with
32c30 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73   pages marked as
32c40 20 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61   dirty in the ca
32c50 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  che..  */.  if( 
32c60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32c70 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
32c80 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  KED ){.    rc = 
32c90 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
32ca0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
32cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32cc0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
32cd0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
32ce0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
32cf0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
32d00 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
32d10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
32d20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
32d30 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
32d40 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
32d50 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
32d60 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
32d70 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
32d80 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
32d90 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
32da0 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  way..  */.  sqli
32db0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
32dc0 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
32dd0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
32de0 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72  ) && !subjRequir
32df0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
32e00 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
32e10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32e20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20  );.  }else{.  . 
32e30 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
32e40 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
32e50 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
32e60 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
32e70 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
32e80 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
32e90 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
32ea0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
32eb0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
32ec0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
32ed0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
32ee0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
32ef0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
32f00 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67   */.    if( !pag
32f10 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
32f20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
32f30 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
32f40 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
32f50 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
32f60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
32f70 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
32f80 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73  dbOrigSize && is
32f90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32fa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  ) ){.        u32
32fb0 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
32fc0 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
32fd0 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d        i64 iOff =
32fe0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
32ff0 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  Off;..        /*
33000 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
33010 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
33020 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
33030 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
33040 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
33050 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
33060 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
33070 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
33080 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
33090 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
330a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
330b0 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
330c0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
330d0 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
330e0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
330f0 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a  alHdr<=pPager->j
33100 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
33110 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
33120 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
33130 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
33140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
33150 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ata2);.        c
33160 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
33170 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
33180 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20  pData2);..      
33190 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
331a0 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
331b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
331c0 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
331d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
331e0 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
331f0 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65  bove, set the ne
33200 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72  ed-sync flag for
33210 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20   the page..     
33220 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
33230 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
33240 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
33250 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
33260 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c  in.        ** pl
33270 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
33280 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
33290 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
332a0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
332b0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
332c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
332d0 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72   And if an IO er
332e0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
332f0 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20   doing so,.     
33300 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75     ** then corru
33310 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77  ption may follow
33320 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
33330 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
33340 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
33350 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  NC;..        rc 
33360 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
33370 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
33380 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
33390 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
333a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
333b0 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
333c0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
333d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
333e0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
333f0 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a  eSize, iOff+4);.
33400 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33410 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
33420 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
33430 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
33440 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
33450 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f+pPager->pageSi
33460 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  ze+4, cksum);.  
33470 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33480 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
33490 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f   rc;..        IO
334a0 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
334b0 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
334c0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
334d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
334e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
334f0 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
33500 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
33510 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
33520 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
33530 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
33540 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
33550 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
33560 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
33570 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
33580 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
33590 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
335a0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
335b0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
335c0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
335d0 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
335e0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
335f0 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
33600 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
33610 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  8 + pPager->page
33620 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50  Size;.        pP
33630 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
33640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
33650 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
33660 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
33670 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
33680 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
33690 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
336a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
336b0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
336c0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
336d0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
336e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
336f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
33700 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
33710 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
33720 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
33730 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
33740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33750 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
33760 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
33770 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
33780 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
337a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
337b0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
337c0 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
337d0 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20  DBMOD ){.       
337e0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
337f0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
33800 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33810 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
33820 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
33830 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
33840 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
33850 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
33860 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
33870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
33880 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
33890 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
338a0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
338b0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
338c0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
338d0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
338e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
338f0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
33900 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
33910 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
33920 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
33930 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
33940 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
33950 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
33960 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
33970 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
33980 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
33990 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
339a0 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
339b0 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
339c0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
339d0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
339e0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20  ge(pPg) ){.     
339f0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
33a00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
33a10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
33a20 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
33a30 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
33a40 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
33a50 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
33a60 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
33a70 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
33a80 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  >pgno;.  }.  ret
33a90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33aa0 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
33ab0 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
33ac0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
33ad0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
33ae0 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68  re .** making ch
33af0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
33b00 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
33b10 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
33b20 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74  n value .** of t
33b30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
33b40 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
33b50 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  to change any pa
33b60 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a  ge data unless .
33b70 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
33b80 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
33b90 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  K..**.** The dif
33ba0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
33bb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
33bc0 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
33bd0 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
33be0 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
33bf0 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
33c00 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
33c10 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
33c20 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
33c30 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
33c40 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
33c50 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
33c60 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
33c70 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
33c80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
33c90 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
33ca0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
33cb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
33cc0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
33cd0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
33ce0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20   returned.** as 
33cf0 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68  appropriate. Oth
33d00 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
33d10 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
33d20 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
33d30 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
33d40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
33d50 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
33d60 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
33d70 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
33d80 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
33d90 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
33da0 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
33db0 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
33dc0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73  pageSize);..  as
33dd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33de0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
33df0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
33e00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33e10 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
33e20 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
33e30 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
33e40 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
33e50 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
33e60 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
33e70 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
33e80 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
33e90 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
33ea0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
33eb0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
33ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33ed0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
33ee0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
33ef0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
33f00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
33f10 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
33f20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
33f30 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
33f40 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
33f50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f70 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
33f80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
33f90 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
33fa0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
33fb0 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
33fc0 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
33fd0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
33fe0 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67  otSyncSpill flag
33ff0 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
34000 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
34010 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20   allow.    ** a 
34020 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
34030 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
34040 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
34050 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20  ournaled by.    
34060 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
34070 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
34080 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
34090 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
340a0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
340b0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l==0 );.    pPag
340c0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
340d0 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ll++;..    /* Th
340e0 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
340f0 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
34100 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
34110 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
34120 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
34130 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
34140 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
34150 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
34160 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
34170 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
34180 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
34190 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
341a0 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
341b0 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
341c0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
341d0 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
341e0 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72  geCount = pPager
341f0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66  ->dbSize;.    if
34200 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
34210 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
34220 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
34230 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
34240 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
34250 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
34260 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
34270 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
34280 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
34290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
342a0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
342b0 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
342c0 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
342d0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
342e0 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
342f0 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
34300 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
34310 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
34320 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
34330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
34340 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
34350 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
34360 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
34370 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
34380 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
34390 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
343a0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
343b0 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
343c0 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
343d0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
343e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
343f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34400 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
34410 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
34420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
34440 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
34450 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
34460 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
34470 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34480 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
34490 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
344a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
344b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
344c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
344d0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
344e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
344f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34500 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
34510 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
34520 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
34530 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
34540 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
34550 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  C ){.          n
34560 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
34570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
34580 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34590 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
345a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
345b0 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
345c0 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
345d0 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
345e0 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
345f0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
34600 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
34610 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
34620 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
34630 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
34640 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
34650 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
34660 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
34670 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
34680 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
34690 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
346a0 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
346b0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
346c0 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
346d0 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
346e0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
346f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
34700 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
34710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
34720 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
34730 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
34740 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   );.      for(ii
34750 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69  =0; ii<nPage; ii
34760 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  ++){.        PgH
34770 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65  dr *pPage = page
34780 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
34790 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20   pg1+ii);.      
347a0 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
347b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
347c0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
347d0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
347e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
347f0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
34800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34810 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
34820 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
34830 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a  SyncSpill==1 );.
34840 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
34850 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20  tSyncSpill--;.  
34860 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
34870 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
34880 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
34890 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
348a0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
348b0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
348c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
348d0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
348e0 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
348f0 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
34900 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
34910 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
34920 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
34930 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
34940 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
34950 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
34960 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
34970 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
34980 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
34990 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
349a0 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
349b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
349c0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
349d0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
349e0 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
349f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
34a00 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
34a10 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
34a20 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
34a30 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
34a40 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
34a50 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
34a60 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
34a70 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
34a80 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
34a90 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
34aa0 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
34ab0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
34ac0 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
34ad0 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
34ae0 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
34af0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
34b00 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
34b10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
34b20 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
34b30 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
34b40 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
34b50 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
34b60 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
34b70 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
34b80 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
34b90 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
34ba0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
34bb0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
34bc0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
34bd0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
34be0 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
34bf0 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
34c00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
34c10 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
34c20 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
34c30 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
34c40 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
34c50 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
34c60 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
34c70 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
34c80 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
34c90 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
34ca0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
34cb0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
34cc0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
34cd0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
34ce0 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
34cf0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
34d00 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
34d10 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
34d20 57 52 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72  WRITE;.    pager
34d30 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
34d40 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
34d50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
34d60 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
34d70 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ment the value o
34d80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34d90 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63  ile .** change-c
34da0 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61  ounter, stored a
34db0 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65  s a 4-byte big-e
34dc0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74  ndian integer st
34dd0 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79  arting at .** by
34de0 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
34df0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
34e00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44  **.** If the isD
34e10 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69  irectMode flag i
34e20 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
34e30 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c  s is done by cal
34e40 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
34e50 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
34e60 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64  page 1, then mod
34e70 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
34e80 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  nts of the.** pa
34e90 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73  ge data. In this
34ea0 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20 77   case the file w
34eb0 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 77  ill be updated w
34ec0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
34ed0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
34ee0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
34ef0 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74 4d  ** The isDirectM
34f00 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c  ode flag may onl
34f10 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  y be non-zero if
34f20 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73   the library was
34f30 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74   compiled.** wit
34f40 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  h the SQLITE_ENA
34f50 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
34f60 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
34f70 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a  In this case,.**
34f80 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20   if isDirect is 
34f90 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
34fa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34fb0 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65   is updated dire
34fc0 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69  ctly.** by writi
34fd0 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65  ng an updated ve
34fe0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
34ff0 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
35000 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  the .** sqlite3O
35010 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  sWrite() functio
35020 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
35030 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
35040 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
35050 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
35060 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e  irectMode){.  in
35070 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35080 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
35090 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
350a0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
350b0 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
350c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
350d0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
350e0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
350f0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35100 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
35110 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69  /* Declare and i
35120 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61  nitialize consta
35130 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69  nt integer 'isDi
35140 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20  rect'. If the.  
35150 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  ** atomic-write 
35160 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
35170 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  enabled in this 
35180 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69  build, then isDi
35190 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69  rect.  ** is ini
351a0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
351b0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
351c0 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
351d0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20   parameter.  ** 
351e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
351f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
35200 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
35210 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
35220 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
35230 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  t if the atomic-
35240 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
35250 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65  on is not.  ** e
35260 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
35270 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70  e time, the comp
35280 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68  iler can omit th
35290 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20  e tests of.  ** 
352a0 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77  'isDirect' below
352b0 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  , as well as the
352c0 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20   block enclosed 
352d0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28  in the.  ** "if(
352e0 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e   isDirect )" con
352f0 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  dition..  */.#if
35300 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
35310 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
35320 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
35330 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28  MODE 0.  assert(
35340 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
35350 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
35360 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
35370 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  ode);.#else.# de
35380 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45  fine DIRECT_MODE
35390 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65   isDirectMode.#e
353a0 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50 61  ndif..  if( !pPa
353b0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
353c0 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Done && pPager->
353d0 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
353e0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20  PgHdr *pPgHdr;  
353f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35400 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   Reference to pa
35410 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20  ge 1 */.    u32 
35420 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20  change_counter; 
35430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
35440 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68  tial value of ch
35450 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
35460 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ld */..    asser
35470 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
35480 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70  File && isOpen(p
35490 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
354a0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
354b0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
354c0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
354d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
354e0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
354f0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
35500 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d  assert( pPgHdr==
35510 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
35520 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  OK );..    /* If
35530 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65   page one was fe
35540 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c  tched successful
35550 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ly, and this fun
35560 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20  ction is not.   
35570 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   ** operating in
35580 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61   direct-mode, ma
35590 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62  ke page 1 writab
355a0 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e  le.  When not in
355b0 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20   .    ** direct 
355c0 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73 20  mode, page 1 is 
355d0 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63  always held in c
355e0 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74  ache and hence t
355f0 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20 20  he PagerGet().  
35600 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c    ** above is al
35610 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c 20  ways successful 
35620 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41  - hence the ALWA
35630 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45  YS on rc==SQLITE
35640 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _OK..    */.    
35650 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45  if( !DIRECT_MODE
35660 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53   && ALWAYS(rc==S
35670 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20  QLITE_OK) ){.   
35680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35690 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
356a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
356b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
356c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72  ){.      /* Incr
356d0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
356e0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
356f0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
35700 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20  yte 24. */.     
35710 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
35720 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
35730 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
35740 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
35750 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
35760 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  ++;.      put32b
35770 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
35780 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
35790 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
357a0 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73  .      /* Also s
357b0 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
357c0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
357d0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
357e0 6e 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  nd in.      ** b
357f0 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
35800 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
35810 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
35820 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
35830 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 76 61  r.      ** is va
35840 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 75  lid. */.      pu
35850 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
35860 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39  pPgHdr->pData)+9
35870 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  2, change_counte
35880 72 29 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62  r);.      put32b
35890 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
358a0 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  dr->pData)+96, S
358b0 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
358c0 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  MBER);..      /*
358d0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64   If running in d
358e0 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74  irect mode, writ
358f0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
35900 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20  f page 1 to the 
35910 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
35920 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29  f( DIRECT_MODE )
35930 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
35940 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20 20  void *zBuf;.    
35950 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
35960 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30  er->dbFileSize>0
35970 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
35980 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 48 64  C2(pPager, pPgHd
35990 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c 20  r->pData, 1, 6, 
359a0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
359b0 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20   zBuf);.        
359c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
359d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
359e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
359f0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
35a00 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
35a10 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
35a20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
35a30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35a40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
35a50 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
35a60 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  one = 1;.       
35a70 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
35a80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
35a90 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
35aa0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
35ab0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
35ac0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
35ad0 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
35ae0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35af0 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  pPgHdr);.  }.  r
35b00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35b10 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
35b20 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20  r file to disk. 
35b30 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
35b40 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  for in-memory fi
35b50 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20  les.** or pages 
35b60 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e  with the Pager.n
35b70 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a  oSync flag set..
35b80 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
35b90 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f  ful, or called o
35ba0 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68  n a pager for wh
35bb0 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ich it is a no-o
35bc0 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  p, this.** funct
35bd0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
35be0 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
35bf0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
35c00 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
35c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
35c20 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
35c30 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
35c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35c60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
35c70 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
35c80 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
35c90 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
35ca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
35cc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
35cd0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
35ce0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
35cf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
35d00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
35d10 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
35d20 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ly be called whi
35d30 6c 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  le a write-trans
35d40 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
35d50 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e   in.** rollback.
35d60 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
35d70 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64  on is in WAL mod
35d80 65 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  e, this call is 
35d90 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68  a no-op. .** Oth
35da0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
35db0 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e  onnection does n
35dc0 6f 74 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ot already have 
35dd0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
35de0 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74  k on .** the dat
35df0 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61  abase file, an a
35e00 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
35e10 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a  o obtain one..**
35e20 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55  .** If the EXCLU
35e30 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72  SIVE lock is alr
35e40 65 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65  eady held or the
35e50 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
35e60 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63  in it is.** succ
35e70 65 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63  essful, or the c
35e80 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
35e90 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45  WAL mode, SQLITE
35ea0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
35eb0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65  .** Otherwise, e
35ec0 69 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53  ither SQLITE_BUS
35ed0 59 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49  Y or an SQLITE_I
35ee0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
35ef0 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
35f00 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
35f10 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
35f20 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  eLock(Pager *pPa
35f30 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
35f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
35f50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35f60 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
35f70 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20  ER_CACHEMOD .   
35f80 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
35f90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35fa0 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20  TER_DBMOD .     
35fb0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
35fc0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35fd0 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20  R_LOCKED .  );. 
35fe0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
35ff0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36000 65 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  er) );.  if( 0==
36010 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
36020 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
36030 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
36040 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
36050 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  SIVE_LOCK);.  }.
36060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36070 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
36080 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
36090 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
360a0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
360b0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
360c0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
360d0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
360e0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
360f0 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
36100 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
36110 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
36120 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
36130 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
36140 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
36150 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
36160 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
36170 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
36180 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
36190 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  res that:.**.** 
361a0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
361b0 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
361c0 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c  nter is updated,
361d0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72  .**   * the jour
361e0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75  nal is synced (u
361f0 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63  nless the atomic
36200 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
36210 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a  ion is used),.**
36220 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70     * all dirty p
36230 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
36240 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
36250 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74   file, .**   * t
36260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36270 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69   is truncated (i
36280 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64  f required), and
36290 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
362a0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
362b0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  . .**.** The onl
362c0 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d  y thing that rem
362d0 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
362e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
362f0 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a  s to finalize .*
36300 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63  * (delete, trunc
36310 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
36320 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74  first part of) t
36330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36340 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  (or .** delete t
36350 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
36360 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
36370 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
36380 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
36390 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
363a0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
363b0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
363c0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
363d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
363e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
363f0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
36400 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
36410 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
36420 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
36430 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
36440 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
36450 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
36460 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
36470 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
36480 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
36490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
364a0 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
364b0 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
364c0 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
364d0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
364e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
364f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36500 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
36510 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
36520 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
36530 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
36540 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
36550 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20  har *zMaster,   
36560 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
36570 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73  ot NULL, the mas
36580 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
36590 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63   */.  int noSync
365a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
365c0 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20   omit the xSync 
365d0 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a  on the db file *
365e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
365f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
36600 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
36610 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
36620 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36630 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36640 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
36650 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36660 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
36670 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
36680 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36690 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
366a0 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
366b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
366c0 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a  AGER_ERROR.  );.
366d0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
366e0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
366f0 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ger) );..  /* If
36700 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f   a prior error o
36710 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20  ccurred, report 
36720 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e  that error again
36730 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
36740 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
36750 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
36760 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50  r->errCode;..  P
36770 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41  AGERTRACE(("DATA
36780 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
36790 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53  %s zMaster=%s nS
367a0 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  ize=%d\n", .    
367b0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
367c0 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  ame, zMaster, pP
367d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a  ager->dbSize));.
367e0 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61  .  /* If no data
367f0 62 61 73 65 20 63 68 61 6e 67 65 73 20 68 61 76  base changes hav
36800 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65 74  e been made, ret
36810 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
36820 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
36830 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f  te<PAGER_WRITER_
36840 43 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75 72  CACHEMOD ) retur
36850 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
36860 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
36870 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
36880 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
36890 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
368a0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
368b0 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a  , or this.    **
368c0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
368d0 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
368e0 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20  d, it is mostly 
368f0 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65  a no-op.  Howeve
36900 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61  r, any.    ** ba
36910 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73  ckup in progress
36920 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
36930 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tarted..    */. 
36940 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
36950 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
36960 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73  pBackup);.  }els
36970 65 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  e{.    if( pager
36980 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
36990 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
369a0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
369b0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
369c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
369d0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
369e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
369f0 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
36a00 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50  Pager, pList, pP
36a10 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c  ager->dbSize, 1,
36a20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
36a30 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
36a40 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  ? pPager->sync_f
36a50 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20  lags : 0).      
36a60 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
36a70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36a80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36a90 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
36aa0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
36ab0 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Cache);.      }.
36ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36ad0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
36ae0 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20  g block updates 
36af0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
36b00 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  er. Exactly how 
36b10 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  it.      ** does
36b20 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   this depends on
36b30 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
36b40 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
36b50 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  e optimization. 
36b60 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62       ** was enab
36b70 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
36b80 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
36b90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
36ba0 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ts the .      **
36bb0 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
36bc0 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
36bd0 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a  ration: .      *
36be0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20  *.      **    * 
36bf0 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
36c00 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
36c10 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
36c20 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ty for.      ** 
36c30 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
36c40 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
36c50 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nd .      **    
36c60 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
36c70 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
36c80 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
36c90 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
36ca0 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79   **    * Exactly
36cb0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
36cc0 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
36cd0 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
36ce0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
36cf0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
36d00 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
36d10 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
36d20 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
36d30 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
36d40 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
36d50 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
36d60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
36d70 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
36d80 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20  change.      ** 
36d90 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69  counter in 'indi
36da0 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74  rect-mode'. If t
36db0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
36dc0 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62  is compiled in b
36dd0 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  ut.      ** is n
36de0 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f  ot applicable to
36df0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
36e00 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a  n, call sqlite3J
36e10 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20  ournalCreate(). 
36e20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20       ** to make 
36e30 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sure the journal
36e40 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c   file has actual
36e50 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  ly been created,
36e60 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20   then call.     
36e70 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
36e80 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
36e90 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
36ea0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
36eb0 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  ndirect.      **
36ec0 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a   mode. .      **
36ed0 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  .      ** Otherw
36ee0 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
36ef0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
36f00 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
36f10 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a  licable,.      *
36f20 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
36f30 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
36f40 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
36f50 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
36f60 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ter.      ** in 
36f70 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49  'direct' mode. I
36f80 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
36f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
36fa0 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20  l never be.     
36fb0 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
36fc0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
36fd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66  ..      */.  #if
36fe0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
36ff0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
37000 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
37010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
37020 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
37030 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
37040 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
37050 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
37060 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
37070 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
37080 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
37090 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
370a0 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
370b0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
370c0 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
370d0 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
370e0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
370f0 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
37100 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
37110 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67   .       && pPag
37120 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67  er->dbSize>=pPag
37130 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20  er->dbOrigSize. 
37140 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50        && (0==(pP
37150 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
37160 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
37170 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20  r->pPCache)) || 
37180 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a  0==pPg->pDirty).
37190 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
371a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
371b0 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
371c0 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
371d0 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
371e0 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  d. The .        
371f0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
37200 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
37210 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
37220 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
37230 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
37240 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
37250 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
37260 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
37270 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
37280 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
37290 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
372a0 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
372b0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
372c0 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ite .        ** 
372d0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
372e0 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
372f0 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
37300 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37310 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
37320 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
37330 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
37340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
37360 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
37370 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
37380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37390 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
373a0 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
373b0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
373c0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
373d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23     }.      }.  #
373e0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
373f0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
37400 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
37410 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
37420 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37430 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
37440 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
37450 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
37460 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
37470 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
37480 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
37490 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
374a0 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  s.      ** being
374b0 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
374c0 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
374d0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
374e0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
374f0 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
37500 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
37510 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
37520 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ode..      **.  
37530 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65      ** Before re
37540 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20  ading the pages 
37550 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
37560 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
37570 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  e .      ** curr
37580 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
37590 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64  er.dbSize, set d
375a0 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68  bSize back to th
375b0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
375c0 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
375d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
375e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
375f0 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
37600 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
37610 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
37620 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20  ) return zeroed 
37630 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66  pages instead of
37640 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69   .      ** readi
37650 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
37660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
37670 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64        */.  #ifnd
37680 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
37690 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
376a0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
376b0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ze<pPager->dbOri
376c0 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26  gSize .       &&
376d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
376e0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
376f0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20  NALMODE_OFF.    
37700 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e    ){.        Pgn
37710 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  o i;            
37720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37730 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
37740 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
37750 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e         const Pgn
37760 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  o iSkip = PAGER_
37770 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
37780 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b   /* Pending lock
37790 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
377a0 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
377b0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
377c0 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
377d0 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
377e0 65 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50  e */ .        pP
377f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
37800 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
37810 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e;.        for( 
37820 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70  i=dbSize+1; i<=p
37830 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
37840 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
37850 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
37860 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
37870 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
37880 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
37890 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 67 48  .            PgH
378a0 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  dr *pPage;      
378b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
378c0 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
378d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
378e0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
378f0 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
37900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
37910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37920 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
37930 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
37940 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
37950 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
37960 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
37970 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
37980 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
37990 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
379a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
379b0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
379c0 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
379d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
379e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
379f0 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65  >dbSize = dbSize
37a00 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e  ;.      } .  #en
37a10 64 69 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  dif.  .      /* 
37a20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
37a30 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
37a40 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
37a50 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
37a60 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
37a70 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
37a80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
37a90 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
37aa0 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20  rnal file, .    
37ab0 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74    ** or if zMast
37ac0 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d  er is NULL (no m
37ad0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20  aster journal), 
37ae0 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69  then this call i
37af0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20  s a no-op..     
37b00 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77   */.      rc = w
37b10 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
37b20 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
37b30 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
37b40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
37b50 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
37b60 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20  one_exit;.  .   
37b70 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
37b80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
37b90 77 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  write all dirty 
37ba0 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
37bb0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  abase..      ** 
37bc0 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  If the atomic-up
37bd0 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
37be0 6e 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2c  n is being used,
37bf0 20 74 68 69 73 20 73 79 6e 63 20 77 69 6c 6c 20   this sync will 
37c00 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  not .      ** cr
37c10 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eate the journal
37c20 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d   file or perform
37c30 20 61 6e 79 20 72 65 61 6c 20 49 4f 2e 0a 20 20   any real IO..  
37c40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
37c50 42 65 63 61 75 73 65 20 74 68 65 20 63 68 61 6e  Because the chan
37c60 67 65 2d 63 6f 75 6e 74 65 72 20 70 61 67 65 20  ge-counter page 
37c70 77 61 73 20 6a 75 73 74 20 6d 6f 64 69 66 69 65  was just modifie
37c80 64 2c 20 75 6e 6c 65 73 73 20 74 68 65 0a 20 20  d, unless the.  
37c90 20 20 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 75 70      ** atomic-up
37ca0 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
37cb0 6e 20 69 73 20 75 73 65 64 20 69 74 20 69 73 20  n is used it is 
37cc0 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
37cd0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
37ce0 20 6a 6f 75 72 6e 61 6c 20 72 65 71 75 69 72 65   journal require
37cf0 73 20 61 20 73 79 6e 63 20 68 65 72 65 2e 20 48  s a sync here. H
37d00 6f 77 65 76 65 72 2c 20 69 6e 20 6c 6f 63 6b 69  owever, in locki
37d10 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
37d20 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20  e.      ** on a 
37d30 73 79 73 74 65 6d 20 75 6e 64 65 72 20 6d 65 6d  system under mem
37d40 6f 72 79 20 70 72 65 73 73 75 72 65 20 69 74 20  ory pressure it 
37d50 69 73 20 6a 75 73 74 20 70 6f 73 73 69 62 6c 65  is just possible
37d60 20 74 68 61 74 20 74 68 69 73 20 69 73 20 0a 20   that this is . 
37d70 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20       ** not the 
37d80 63 61 73 65 2e 20 49 6e 20 74 68 69 73 20 63 61  case. In this ca
37d90 73 65 20 69 74 20 69 73 20 6c 69 6b 65 6c 79 20  se it is likely 
37da0 65 6e 6f 75 67 68 20 74 68 61 74 20 74 68 65 20  enough that the 
37db0 72 65 64 75 6e 64 61 6e 74 0a 20 20 20 20 20 20  redundant.      
37dc0 2a 2a 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 20  ** xSync() call 
37dd0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
37de0 74 6f 20 61 20 6e 6f 2d 6f 70 20 62 79 20 74 68  to a no-op by th
37df0 65 20 4f 53 20 61 6e 79 68 6f 77 2e 20 0a 20 20  e OS anyhow. .  
37e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
37e10 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
37e20 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
37e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37e40 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
37e50 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
37e60 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61    .      rc = pa
37e70 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
37e80 73 74 28 70 50 61 67 65 72 2c 73 71 6c 69 74 65  st(pPager,sqlite
37e90 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
37ea0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
37eb0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
37ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37ed0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
37ee0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
37ef0 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20  BLOCKED );.     
37f00 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70     goto commit_p
37f10 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
37f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
37f30 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
37f40 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
37f50 68 65 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  he);.  .      /*
37f60 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
37f70 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20  disk is not the 
37f80 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65  same size as the
37f90 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
37fa0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75  .      ** then u
37fb0 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  se pager_truncat
37fc0 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72  e to grow or shr
37fd0 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72  ink the file her
37fe0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
37ff0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
38000 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62  Size!=pPager->db
38010 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
38020 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20      Pgno nNew = 
38030 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d  pPager->dbSize -
38040 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
38050 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
38060 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
38070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
38080 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
38090 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
380a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
380b0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
380c0 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  er, nNew);.     
380d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
380e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
380f0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
38100 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
38110 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
38120 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
38130 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
38140 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
38150 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20  Sync && !noSync 
38160 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38170 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
38180 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
38190 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
381a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
381b0 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70  RACE(("DBSYNC %p
381c0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
381d0 20 20 7d 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f    }.  }..commit_
381e0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a  phase_one_exit:.
381f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38200 5f 4f 4b 20 26 26 20 21 70 61 67 65 72 55 73 65  _OK && !pagerUse
38210 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
38220 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
38230 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
38240 5f 46 49 4e 49 53 48 45 44 3b 0a 20 20 7d 0a 20  _FINISHED;.  }. 
38250 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
38260 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
38270 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
38280 65 64 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ed, the database
38290 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
382a0 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64  ompletely.** upd
382b0 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20  ated to reflect 
382c0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
382d0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
382e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a  transaction and.
382f0 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
38300 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  k. The journal f
38310 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
38320 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
38330 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20  tem .** though, 
38340 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75 72 65  and if a failure
38350 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
38360 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76  point it will ev
38370 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75  entually.** be u
38380 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  sed as a hot-jou
38390 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72  rnal and the cur
383a0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
383b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
383c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
383d0 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  n finalizes the 
383e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69  journal file, ei
383f0 74 68 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67  ther by deleting
38400 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67  , .** truncating
38410 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65   or partially ze
38420 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61  roing it, so tha
38430 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75  t it cannot be u
38440 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d  sed .** for hot-
38450 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
38460 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64  . Once this is d
38470 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  one the transact
38480 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f  ion is.** irrevo
38490 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e  cably committed.
384a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
384b0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  or occurs, an IO
384c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
384d0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
384e0 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69  pager.** moves i
384f0 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74  nto the error st
38500 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
38510 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
38520 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
38530 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
38540 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a  PhaseTwo(Pager *
38550 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
38560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
38570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38580 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
38590 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
385a0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
385b0 62 65 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70  be called if a p
385c0 72 69 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f  rior error has o
385d0 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75  ccurred..  ** Bu
385e0 74 20 69 66 20 28 64 75 65 20 74 6f 20 61 20 63  t if (due to a c
385f0 6f 64 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65  oding error else
38600 77 68 65 72 65 20 69 6e 20 74 68 65 20 73 79 73  where in the sys
38610 74 65 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74  tem) it does get
38620 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75  .  ** called, ju
38630 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
38640 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69  me error code wi
38650 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
38660 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  hing. */.  if( N
38670 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
38680 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
38690 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
386a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
386b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
386c0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
386d0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
386e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
386f0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20  RITER_FINISHED. 
38700 20 20 20 20 20 20 7c 7c 20 28 70 61 67 65 72 55        || (pagerU
38710 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
38720 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
38730 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
38740 43 48 45 4d 4f 44 29 0a 20 20 29 3b 0a