/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact b7c7af7c5b6ee6f36d7fca825346a317c1ea0a55:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7140: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7150: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7170: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7180: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7190: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
71a0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71b0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71c0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71d0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71e0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
7200: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7210: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7220: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7250: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7260: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7270: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7280: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7290: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
72a0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72b0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72d0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72f0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
7300: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7320: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7330: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7340: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7350: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7360: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7370: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7380: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7390: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
73a0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73b0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73c0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73d0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73e0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
7400: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7410: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7420: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7430: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7440: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7450: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7460: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7470: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7490: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
74a0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74f0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7550: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7560: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7570: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7580: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7590: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
75a0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75b0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75c0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75d0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75e0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75f0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7600: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7610: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7620: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7630: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7640: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7650: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7660: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7680: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7690: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
76a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76b0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76c0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76d0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76e0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76f0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7700: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7710: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7720: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7750: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7760: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7770: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
77a0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77e0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77f0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7800: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7810: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7820: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7830: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7840: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7850: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7860: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7880: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7890: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
78a0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78b0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78d0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78e0: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
78f0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7900: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7910: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7920: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
7930: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
7940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
7950: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
7960: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7970: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7980: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7990: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
79a0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
79c0: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
79d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
79e0: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
79f0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7a00: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7a10: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7a20: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7a30: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7a40: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7a50: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7a70: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7a80: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7a90: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7aa0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7ac0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7ad0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7ae0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7af0: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7b10: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7b20: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7b30: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7b40: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7b50: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7b60: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7b70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7b80: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7b90: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7ba0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7bb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7bc0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7bd0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7be0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7bf0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7c00: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7c10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7c20: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7c30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c40: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7c50: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7c60: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7c70: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7c80: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7c90: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7ca0: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7cc0: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7cd0: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7ce0: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7cf0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7d00: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7d10: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7d20: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7d30: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7d40: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
7d50: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
7d60: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
7d70: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
7d80: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
7d90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7da0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
7db0: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
7dc0: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
7dd0: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
7de0: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
7df0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
7e00: 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 75 38 20  hanges */..  u8 
7e10: 62 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20  bUseFetch;      
7e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7e30: 20 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29   to use xFetch()
7e40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f   */.  int nMmapO
7e50: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
7e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
7e70: 6d 61 70 20 70 61 67 65 73 20 63 75 72 72 65 6e  map pages curren
7e80: 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  tly outstanding 
7e90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
7ea0: 36 34 20 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20  64 szMmap;      
7eb0: 20 2f 2a 20 44 65 73 69 72 65 64 20 6d 61 78 69   /* Desired maxi
7ec0: 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f  mum mmap size */
7ed0: 0a 20 20 50 67 48 64 72 20 2a 70 4d 6d 61 70 46  .  PgHdr *pMmapF
7ee0: 72 65 65 6c 69 73 74 3b 20 20 20 20 20 20 20 2f  reelist;       /
7ef0: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 6d  * List of free m
7f00: 6d 61 70 20 70 61 67 65 20 68 65 61 64 65 72 73  map page headers
7f10: 20 28 70 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f   (pDirty) */.  /
7f20: 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68  *.  ** End of th
7f30: 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e  e routinely-chan
7f40: 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65  ging class membe
7f50: 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rs.  ***********
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fa0: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
7fd0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
7fe0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
7ff0: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
8000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8010: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
8020: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
8030: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
8040: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8060: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
8070: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
8080: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
8090: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
80a0: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
80b0: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
80c0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
80d0: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
80f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
8100: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
8110: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
8120: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
8130: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
8140: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
8150: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8160: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
8170: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
8180: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
8190: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
81a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
81c0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
81d0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
81e0: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
81f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8200: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
8210: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
8220: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
8230: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
8240: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
8250: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
8260: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
8270: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
8280: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
8290: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
82a0: 69 6e 74 20 61 53 74 61 74 5b 33 5d 3b 20 20 20  int aStat[3];   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
82c0: 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 2c  otal cache hits,
82d0: 20 6d 69 73 73 65 73 20 61 6e 64 20 77 72 69 74   misses and writ
82e0: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
82f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
8300: 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  Read;           
8310: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8320: 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a 2f  se pages read */
8330: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8340: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8350: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8360: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8370: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8380: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8390: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
83a0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
83b0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
83c0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
83d0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
83e0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
83f0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8400: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8410: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8420: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8430: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8440: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8460: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8470: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8480: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8490: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
84a0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
84b0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
84c0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
84d0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
84e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
84f0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8500: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8510: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8520: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8530: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8540: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8550: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8570: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8590: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
85a0: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
85b0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
85c0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85e0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
85f0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8600: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8610: 2a 20 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73  * Indexes for us
8620: 65 20 77 69 74 68 20 50 61 67 65 72 2e 61 53 74  e with Pager.aSt
8630: 61 74 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e  at[]. The Pager.
8640: 61 53 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f  aStat[] array co
8650: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
8660: 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79  lues accessed by
8670: 20 70 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f   passing SQLITE_
8680: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48  DBSTATUS_CACHE_H
8690: 49 54 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a  IT, CACHE_MISS .
86a0: 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54  ** or CACHE_WRIT
86b0: 45 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f  E to sqlite3_db_
86c0: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65  status()..*/.#de
86d0: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
86e0: 48 49 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20  HIT   0.#define 
86f0: 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20  PAGER_STAT_MISS 
8700: 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   1.#define PAGER
8710: 5f 53 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f  _STAT_WRITE 2../
8720: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
8730: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
8740: 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72  les hold counter
8750: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
8760: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f  sting purposes o
8770: 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69  nly.  These vari
8780: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69  ables do not exi
8790: 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74  st in.** a non-t
87a0: 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54  esting build.  T
87b0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61  hese variables a
87c0: 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  re not thread-sa
87d0: 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  fe..*/.#ifdef SQ
87e0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
87f0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
8800: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8810: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
8820: 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
8830: 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  om DB */.int sql
8840: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
8850: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8860: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
8870: 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  l pages written 
8880: 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  to DB */.int sql
8890: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
88a0: 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  j_count = 0;    
88b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
88c0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  es written to jo
88d0: 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e  urnal */.# defin
88e0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20  e PAGER_INCR(v) 
88f0: 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   v++.#else.# def
8900: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
8910: 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a  ).#endif..../*.*
8920: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
8930: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
8940: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
8950: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
8960: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
8970: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
8980: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
8990: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
89a0: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
89b0: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
89c0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
89d0: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
89e0: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
89f0: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
8a00: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
8a10: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
8a20: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
8a30: 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74  s being.** writt
8a40: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
8a50: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
8a60: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
8a70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8a80: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
8a90: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
8aa0: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
8ab0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
8ac0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
8ad0: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
8ae0: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
8af0: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
8b00: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
8b10: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
8b20: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
8b30: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
8b40: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
8b50: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
8b60: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
8b70: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
8b80: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
8b90: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
8ba0: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
8bb0: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
8bc0: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
8bd0: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
8be0: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
8bf0: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
8c00: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
8c10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8c20: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
8c30: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
8c40: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
8c50: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
8c60: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
8c70: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
8c80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8c90: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
8ca0: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
8cb0: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
8cc0: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
8cd0: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
8ce0: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
8cf0: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
8d00: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
8d10: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
8d20: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
8d30: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
8d40: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
8d50: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
8d60: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
8d70: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
8d80: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
8d90: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
8da0: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
8db0: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
8dc0: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
8dd0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
8de0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
8df0: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
8e00: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
8e10: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
8e20: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
8e30: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
8e40: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
8e50: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
8e60: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
8e70: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
8e80: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
8e90: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
8ea0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65  size of the of e
8eb0: 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20  ach page record 
8ec0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
8ed0: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68  s given by.** th
8ee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
8ef0: 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  o..*/.#define JO
8f00: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
8f10: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
8f20: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
8f30: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8f40: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
8f50: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69   this pager. Thi
8f60: 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65  s is usually the
8f70: 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61   same .** size a
8f80: 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  s a single disk 
8f90: 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f  sector. See also
8fa0: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29   setSectorSize()
8fb0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
8fc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8fd0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
8fe0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
8ff0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
9000: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9010: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
9020: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9030: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
9040: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
9050: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
9060: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9070: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
9080: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
9090: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
90a0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
90b0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
90c0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
90d0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
90e0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
90f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9100: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
9110: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
9120: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
9130: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
9140: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
9150: 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54  The macro USEFET
9160: 43 48 20 69 73 20 74 72 75 65 20 69 66 20 77 65  CH is true if we
9170: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
9180: 75 73 65 20 74 68 65 20 78 46 65 74 63 68 20 61  use the xFetch a
9190: 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69  nd xUnfetch.** i
91a0: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61 63 63  nterfaces to acc
91b0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
91c0: 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61   using memory-ma
91d0: 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66  pped I/O..*/.#if
91e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
91f0: 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65  _SIZE>0.# define
9200: 20 55 53 45 46 45 54 43 48 28 78 29 20 28 28 78   USEFETCH(x) ((x
9210: 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65  )->bUseFetch).#e
9220: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45  lse.# define USE
9230: 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69  FETCH(x) 0.#endi
9240: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
9250: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
9260: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
9270: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
9280: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
9290: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
92a0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
92b0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
92c0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
92d0: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
92e0: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
92f0: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
9300: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
9310: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
9320: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9330: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
9340: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
9350: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
9360: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
9370: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
9380: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
9390: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
93a0: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
93b0: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
93c0: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
93d0: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
93e0: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52  ethods)../*.** R
93f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9400: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9410: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9420: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9430: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9440: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9450: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9470: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9480: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
9490: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
94a0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
94b0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
94c0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
94d0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
94e0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
94f0: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9500: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9510: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9520: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9530: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9540: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9550: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9560: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9570: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9580: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
9590: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
95a0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
95b0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
95c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
95d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
95e0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
95f0: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9600: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9610: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9620: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9630: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9650: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9660: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9670: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9680: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
9690: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
96a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
96b0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
96c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
96d0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
96e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
96f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9700: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9710: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9720: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9730: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9740: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9750: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9760: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9770: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9780: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9790: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97a0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
97b0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
97c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
97d0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
97e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
97f0: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9800: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9810: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9820: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9830: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9840: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9850: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9860: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9870: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9880: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9890: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
98a0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
98b0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
98c0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
98d0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
98e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
98f0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9900: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9910: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9920: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9930: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9940: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9950: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9960: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9970: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9980: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9990: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
99a0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
99b0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
99c0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
99d0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
99e0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
99f0: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9a00: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9a10: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9a20: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9a30: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9a40: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9a50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9a60: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9a70: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9a80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9a90: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9aa0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9ab0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9ac0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9ad0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9ae0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9af0: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9b00: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9b10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9b20: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9b30: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9b40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9b50: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9b60: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9b70: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9b80: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9b90: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9ba0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9bb0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9bc0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9bd0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9be0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9bf0: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9c00: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9c10: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9c30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c50: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9c60: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9c70: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c80: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9ca0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9cb0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9cc0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ce0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
9cf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
9d00: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
9d10: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
9d20: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
9d30: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
9d40: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
9d50: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9d60: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9d70: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
9d80: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
9d90: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
9da0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9db0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
9dc0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
9dd0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
9de0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
9df0: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
9e00: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
9e10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9e20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9e30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9e40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
9e50: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
9e60: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
9e70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
9e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9e90: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
9ea0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
9eb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9ec0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9ed0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ee0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9ef0: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9f00: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9f10: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
9f20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9f30: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9f40: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
9f50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f60: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
9f70: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9f80: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
9f90: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
9fa0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
9fb0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9fc0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9fd0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
9fe0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
9ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a000: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a010: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a020: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a030: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a040: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a050: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a070: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a080: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a090: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a0a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0b0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a0d0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a0e0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a0f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a100: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a110: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a120: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a130: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a140: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a150: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a160: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a170: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a180: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a190: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a1a0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a1b0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a1c0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a1d0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a1e0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a1f0: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a200: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a210: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a220: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a230: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a240: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a250: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a260: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a270: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a280: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a290: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a2a0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a2c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a2d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a2e0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a320: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a330: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a340: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a350: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a360: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a370: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a380: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a390: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a3a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a3b0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a3c0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a3d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a3e0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a3f0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a400: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a410: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a420: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a430: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a440: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a450: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a460: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a470: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a480: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a490: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a4a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a4b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a4c0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a4d0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a4e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a4f0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a500: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a510: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a520: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a530: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a540: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a550: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a560: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a570: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a580: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a590: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a5a0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a5b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a5d0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a5e0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a5f0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a600: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a610: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a620: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a630: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a640: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a650: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a660: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a670: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a680: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a690: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a6a0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a6b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a6c0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a6d0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a6e0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
a6f0: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
a700: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
a710: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
a720: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
a730: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
a740: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
a750: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a760: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a770: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
a780: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a790: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
a7a0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
a7b0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
a7c0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
a7d0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
a7e0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
a7f0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a800: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
a810: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
a820: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
a830: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
a840: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
a850: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
a860: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
a870: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
a880: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
a890: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
a8a0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
a8b0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
a8c0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
a8d0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
a8e0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
a8f0: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
a900: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
a910: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
a920: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
a930: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
a940: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
a950: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
a960: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
a970: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
a980: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
a990: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
a9a0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
a9b0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
a9c0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
a9d0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
a9e0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
a9f0: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
aa00: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
aa10: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
aa20: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
aa30: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
aa40: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
aa50: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
aa60: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
aa70: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
aa80: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
aa90: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
aaa0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
aab0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
aac0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
aad0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
aae0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
aaf0: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ab00: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ab10: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ab20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ab30: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ab40: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ab50: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ab60: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ab70: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ab80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ab90: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aba0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
abb0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
abc0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
abd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
abe0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
abf0: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
ac00: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ac10: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
ac20: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
ac30: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
ac40: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ac50: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
ac60: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
ac70: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ac80: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
ac90: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
aca0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
acb0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
acc0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
acd0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
ace0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
acf0: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
ad00: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
ad10: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
ad20: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
ad30: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
ad40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
ad50: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
ad60: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
ad70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
ad80: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
ad90: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
ada0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
adb0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
adc0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
add0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
ade0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
adf0: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
ae00: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
ae10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ae20: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
ae30: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
ae40: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
ae50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ae60: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
ae70: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
ae80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ae90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aea0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
aeb0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
aec0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aed0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aee0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
aef0: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
af00: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
af10: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
af20: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
af30: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
af40: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
af50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
af60: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
af70: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
af80: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
af90: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
afa0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
afb0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
afc0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
afd0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
afe0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
aff0: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b000: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b010: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b020: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b030: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b050: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b060: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b070: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b080: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b090: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b0a0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b0b0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b0c0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b0d0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b0e0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b0f0: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b100: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b110: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b120: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b130: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b140: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b150: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b160: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b170: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b180: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b190: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b1a0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b1b0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b1c0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b1d0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b1e0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b1f0: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b200: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b210: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b220: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b230: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b240: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b250: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b260: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b270: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b280: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b290: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b2a0: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
b2b0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b2c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b2d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b2f0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
b300: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
b310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b320: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b330: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
b340: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
b350: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
b360: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
b370: 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
b380: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
b390: 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  gno);.}../*.** R
b3a0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b3b0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b3c0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b3d0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b3e0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b3f0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b400: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b410: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b420: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b430: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b440: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b450: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b460: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b470: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b480: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b490: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b4a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b4b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b4c0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b4d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b4e0: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b4f0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b500: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b510: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b530: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b540: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b560: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b570: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b580: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b590: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b5a0: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b5b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b5c0: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b5d0: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b5e0: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b5f0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b600: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b610: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b620: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b630: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b640: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b650: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b660: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b680: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b690: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b6a0: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b6b0: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b6c0: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b6d0: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b6e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b6f0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b710: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b720: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b730: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b740: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b750: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b760: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b770: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b780: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b790: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b7a0: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b7b0: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b7c0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b7d0: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b7e0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b7f0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b800: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b810: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b820: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b830: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b840: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b850: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b860: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b870: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b880: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b890: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b8a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b8b0: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b8c0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b8d0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b8e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b8f0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b900: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b910: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b920: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b930: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b940: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b950: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b960: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b970: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b980: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b990: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b9a0: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b9b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b9c0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b9d0: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
b9e0: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
b9f0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
ba00: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
ba10: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
ba20: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
ba30: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
ba40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
ba50: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
ba60: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
ba70: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
ba80: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
ba90: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
baa0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bab0: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bac0: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bad0: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bae0: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
baf0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bb00: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bb10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bb20: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bb30: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bb40: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bb50: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bb60: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bb70: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bb80: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bb90: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bba0: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bbb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bbc0: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bbd0: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bbe0: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bbf0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bc00: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bc10: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bc20: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bc30: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bc40: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bc50: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bc60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bc70: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bc80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bc90: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bca0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bcb0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bcc0: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bcd0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bce0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bcf0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bd00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bd10: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bd20: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bd30: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bd40: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
bd50: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
bd60: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bd70: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bd80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bd90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bda0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bdb0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bdc0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bdd0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bde0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bdf0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
be00: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
be10: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
be20: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
be30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
be40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
be50: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
be60: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
be70: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
be80: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
be90: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bea0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
beb0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bec0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bed0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bee0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bef0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bf00: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bf10: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bf20: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bf30: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bf40: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bf50: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bf60: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bf70: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bf80: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bf90: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bfa0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bfb0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bfc0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bfd0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bfe0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
bff0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c000: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c010: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c020: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c030: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c040: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c050: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c060: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c070: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c080: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c090: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c0a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c0b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c0c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c0d0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c0e0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c0f0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c100: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c110: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c120: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c130: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c140: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c150: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c160: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c170: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c180: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c1b0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c1c0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c1d0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c1f0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c200: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c230: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c240: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c250: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c260: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c270: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c280: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c290: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c2a0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c2b0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c2c0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c2d0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c2e0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c2f0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c300: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c310: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c320: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c330: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c340: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c350: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c360: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c370: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c390: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c3a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c3b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c3c0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c3d0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c3e0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c3f0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c400: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c410: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c420: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c430: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c440: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c450: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c460: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c470: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c480: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c490: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c4a0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c4b0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c4c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c4d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c4e0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c4f0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c500: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c510: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c520: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c530: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c540: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c550: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c560: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c570: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c580: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c590: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c5a0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c5b0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c5c0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c5d0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c5e0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c5f0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c600: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c610: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c620: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c630: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c650: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c660: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c670: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c680: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c690: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c6a0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c6b0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c6c0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c6d0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c6e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c6f0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c700: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c710: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c720: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c730: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c740: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c750: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c760: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c770: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c780: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c790: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c7a0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c7b0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c7c0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c7d0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c7e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c7f0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c800: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c810: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c820: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c830: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c840: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c850: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c860: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c870: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c880: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c890: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c8a0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c8b0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c8c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c8d0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c8e0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c8f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c900: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c910: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c920: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c930: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c940: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c950: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c960: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c970: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c980: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c990: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c9a0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c9b0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c9c0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c9d0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c9e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c9f0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
ca00: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
ca10: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
ca20: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
ca30: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
ca40: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
ca50: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
ca60: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
ca70: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
ca80: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
ca90: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
caa0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cab0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cad0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cae0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
caf0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cb00: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cb10: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cb20: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cb30: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cb40: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cb50: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cb60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cb70: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cb80: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cb90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cba0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cbb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cbc0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cbd0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cbe0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cbf0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
cc00: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
cc10: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
cc20: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cc30: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
cc40: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cc50: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cc60: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cc70: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cc80: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cc90: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ccb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ccc0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
ccd0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cce0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
ccf0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cd00: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cd10: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cd20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cd30: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cd40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cd50: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cd60: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cd70: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cd80: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cd90: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cda0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cdb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cdc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cdd0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cde0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cdf0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ce00: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
ce10: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ce20: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce40: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
ce50: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
ce60: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
ce70: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
ce90: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cea0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ceb0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cee0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cef0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cf00: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cf10: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cf20: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cf30: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cf40: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cf50: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cf60: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cf70: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cf80: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cf90: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cfa0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cfb0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cfc0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cfd0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cfe0: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
cff0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d000: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d010: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d020: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d030: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d040: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d050: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d060: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d070: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d080: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d090: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d0a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d0b0: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d0c0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d0d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d0e0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d0f0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d100: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d110: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d120: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d130: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d140: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d150: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d160: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d170: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d180: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d190: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d1a0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d1b0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d1c0: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d1d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d1e0: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d1f0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d200: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d210: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d230: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d240: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d250: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d260: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d270: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d280: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d290: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d2a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d2b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d2c0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d2d0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d2e0: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d2f0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d300: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d310: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d320: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d330: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d340: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d350: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d360: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d370: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d380: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d390: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d3a0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3d0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d420: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d430: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d440: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d450: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d460: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d470: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d480: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d490: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d4a0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d4b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d4c0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d4d0: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d4e0: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d4f0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d500: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d510: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d520: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d530: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d540: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d550: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d560: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d570: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d580: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d590: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d5a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d5b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d5c0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d5d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d5e0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d5f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d600: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d610: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d620: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d630: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d640: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d650: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d660: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d670: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d680: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d690: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d6a0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d6b0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d6c0: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d6d0: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d6e0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d6f0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d700: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d710: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d720: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d730: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d740: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d750: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d760: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d770: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d780: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d790: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d7a0: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d7b0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d7c0: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d7d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d7e0: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d7f0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d800: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d810: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d820: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d830: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d840: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d850: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d860: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d870: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d880: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d890: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d8a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d8b0: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d8c0: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d8d0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d8e0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d8f0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d900: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d910: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d920: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d930: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d940: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
d950: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
d960: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
d970: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
d980: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
d990: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
d9a0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
d9b0: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
d9c0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
d9d0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
da00: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
da10: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
da20: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
da30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
da40: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
da50: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
da60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
da70: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
da80: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
da90: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
daa0: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dab0: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dac0: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dad0: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dae0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
daf0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
db00: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
db10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
db20: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
db30: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
db40: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
db50: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
db60: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
db70: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
db80: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
db90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dba0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dbb0: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dbc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dbd0: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dbe0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dbf0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dc00: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dc10: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dc20: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dc30: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dc40: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dc50: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dc60: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dc70: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dc80: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dc90: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dcb0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dcc0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dcd0: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dce0: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dcf0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
dd00: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
dd10: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
dd20: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dd30: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
dd40: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
dd50: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
dd60: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
dd70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd80: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
dd90: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
dda0: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
ddb0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ddc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
ddd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
dde0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
ddf0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
de00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
de10: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
de20: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
de30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
de40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
de50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
de60: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
de70: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
de80: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
de90: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
dea0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
deb0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
dec0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ded0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
dee0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
def0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
df00: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
df10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
df20: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
df30: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
df40: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
df50: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
df60: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
df70: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
df80: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
df90: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
dfa0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
dfb0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
dfc0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
dfd0: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
dfe0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
dff0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e000: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e010: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e020: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e030: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e040: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e050: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e060: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e070: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e080: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e090: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e0a0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e0b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e0c0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e0d0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e0e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e110: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e120: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e130: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e140: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e150: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e160: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e170: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e180: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e190: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e1a0: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e1b0: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e1e0: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e1f0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e200: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e230: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e240: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e250: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e260: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e270: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e280: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e290: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e2a0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e2b0: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e2c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e2d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e2e0: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e2f0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e300: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e310: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e320: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e330: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e340: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e350: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e360: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e370: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e380: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e390: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e3a0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e3b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e3c0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e3d0: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e3e0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e3f0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e400: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e410: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e430: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e440: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e450: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e460: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e470: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e480: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e490: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e4a0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e4b0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e4c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e4d0: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e4e0: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e4f0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e500: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e510: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e520: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e540: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e550: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e560: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e570: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e580: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e590: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e5a0: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e5b0: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e5c0: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e5d0: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e5e0: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e5f0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e600: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e610: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e620: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e630: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e640: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e650: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e660: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e670: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e680: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e690: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e6a0: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e6b0: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e6c0: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e6d0: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e6e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e6f0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e700: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e710: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e720: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e730: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e740: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e750: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e760: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e770: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e780: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e790: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e7a0: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e7b0: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e7c0: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e7d0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e7e0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e7f0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e800: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e810: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e820: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e830: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e840: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e850: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e860: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e870: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e880: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e890: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e8a0: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e8b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e8c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e8d0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e8e0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e8f0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e900: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e910: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e920: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e930: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e940: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
e950: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e960: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
e970: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e980: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e990: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
e9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
e9b0: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
e9c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e9d0: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
e9e0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
e9f0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
ea00: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
ea10: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ea20: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
ea30: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
ea40: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ea50: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ea60: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ea70: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ea80: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ea90: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eaa0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eab0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eac0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ead0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eae0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eaf0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
eb00: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
eb10: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
eb20: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
eb30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb50: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
eb60: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
eb70: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
eb80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
eb90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
eba0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ebb0: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ebc0: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ebd0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ebe0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
ebf0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ec00: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ec10: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ec20: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ec30: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ec40: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ec50: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ec60: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ec70: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ec80: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ec90: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
eca0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ecb0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ecc0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ecd0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ece0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
ecf0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
ed00: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
ed10: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
ed20: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ed30: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
ed40: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ed50: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ed60: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ed70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ed80: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ed90: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
eda0: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
edb0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
edc0: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
edd0: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ede0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
edf0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
ee00: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
ee10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ee20: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
ee30: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
ee40: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ee50: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ee60: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ee70: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ee80: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ee90: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
eea0: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
eeb0: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
eec0: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
eed0: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
eee0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
eef0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
ef00: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
ef10: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
ef20: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
ef30: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
ef40: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
ef50: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
ef60: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
ef70: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
ef80: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
ef90: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
efa0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
efb0: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
efc0: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
efd0: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
efe0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
eff0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f000: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f010: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f020: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f030: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f040: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f050: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f060: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f070: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f080: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f090: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f0a0: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f0b0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f0c0: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f0d0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f0e0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f0f0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f100: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f110: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f120: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f130: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f140: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f150: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f160: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f170: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f180: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f190: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f1a0: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f1b0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f1c0: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f1d0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f1e0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f1f0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f200: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f210: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f220: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f230: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f240: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f250: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f260: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f270: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f280: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f290: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f2a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f2b0: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f2c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f2d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f2e0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f300: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f310: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f320: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f330: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f340: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f350: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f360: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f370: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f380: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f390: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f3a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f3b0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f3c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f3d0: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f3e0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f3f0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f400: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f410: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f420: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f430: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f440: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f450: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f460: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f470: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f480: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f490: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f4a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f4b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f4c0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f4d0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f4e0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f4f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f500: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f510: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f520: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f530: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f540: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f550: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f560: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f570: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f580: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f590: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f5a0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f5c0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f5d0: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f5e0: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f600: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f610: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f620: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f630: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f640: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f650: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f660: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f670: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f690: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f6a0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f6b0: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f6c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f6f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f700: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f710: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f720: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f730: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f740: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f760: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f770: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f780: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f790: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f7a0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f7b0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f7c0: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f7d0: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f7e0: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f7f0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f800: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f810: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f820: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f830: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f840: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f850: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f860: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f870: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f890: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f8a0: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f8b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f8c0: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f8d0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f8e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f8f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f900: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f910: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f920: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f930: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f940: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
f950: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f960: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
f970: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
f980: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
f990: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
f9a0: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
f9b0: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
f9c0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
f9d0: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
f9e0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
f9f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fa00: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fa10: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fa20: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fa30: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fa40: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fa50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fa60: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fa70: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fa80: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fa90: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
faa0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fab0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fac0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fad0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fae0: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
faf0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fb00: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fb10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fb20: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fb30: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fb40: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fb50: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fb60: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fb70: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fb80: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fb90: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fba0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fbb0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fbc0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fbd0: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fbe0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fbf0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fc00: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fc10: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fc20: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fc30: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fc40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fc50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fc60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fc70: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fc80: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fc90: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fca0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fcb0: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fcc0: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fcd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fce0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fcf0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fd00: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fd10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fd20: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fd30: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fd40: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fd50: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fd70: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fd80: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fd90: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fda0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fdb0: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fdc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fdd0: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fde0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fdf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fe00: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fe10: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fe20: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fe30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fe40: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fe50: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
fe60: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
fe70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
fe80: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
fe90: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
fea0: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
feb0: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
fec0: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
fed0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
fee0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
fef0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ff00: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ff10: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ff20: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ff30: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
ff40: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
ff50: 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
ff60: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
ff70: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
ff80: 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
ff90: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
ffa0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
ffb0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
ffc0: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
ffd0: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
ffe0: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
fff0: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10000 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10010 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10020 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10030 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
10040 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10050 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10060 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10070 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10080 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10090 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
100a0 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
100b0 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
100c0 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
100d0 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
100e0 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
100f0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10100 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10110 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10120 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10130 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
10140 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10150 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10160 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10170 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10180 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10190 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
101a0 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
101b0 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
101c0 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
101d0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
101e0 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
101f0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10200 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10210 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10220 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10230 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
10240 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10250 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10260 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10270 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10290 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
102a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
102b0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
102c0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
102d0 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
102e0 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
102f0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10300 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10310 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10320 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10330 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
10340 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10350 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10360 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10370 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10380 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10390 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
103a0 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
103b0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
103c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
103d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
103e0 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
103f0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10400 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10410 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10420 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10430 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
10440 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10450 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10460 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10470 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10480 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10490 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
104a0 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
104b0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
104c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
104d0 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
104e0 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
104f0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10500 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10510 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10520 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10530 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
10540 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10550 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10560 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10570 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10580 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10590 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
105a0 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
105b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
105c0 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
105d0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
105e0 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
105f0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
10600 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
10610 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
10620 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
10630 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
10640 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10650 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10660 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10670 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10680 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10690 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
106a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
106b0 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
106c0 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
106d0 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
106e0 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
106f0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
10700 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
10710 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
10720 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10730 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
10740 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10750 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10760 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10770 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10780 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10790 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
107a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
107b0 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
107c0 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
107d0 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
107e0 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
107f0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
10800 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
10810 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
10820 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
10830 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
10840 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10850 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10860 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10870 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10880 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10890 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
108a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
108b0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
108c0 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
108d0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
108e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
108f0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10900 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10910 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10920 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10950 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10960 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10980 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10990 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
109a0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109c0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
109d0 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
109e0 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
109f0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10a00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10a10 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10a20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10a30 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a50 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10a60 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10a80 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10a90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10aa0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10ab0 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10ac0 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10ae0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10af0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10b00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10b10 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b30 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10b40 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10b50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10b60 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10b70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10b80 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10b90 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10ba0 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10bb0 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10bc0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10bd0 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10be0 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10bf0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10c00 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10c10 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10c20 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10c30 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10c40 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10c50 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10c60 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10c70 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10c80 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10c90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10ca0 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10cb0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10cc0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10cd0 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10ce0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10cf0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10d10 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10d20 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10d30 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10d40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10d50 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10d60 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10d70 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10d90 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10da0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10db0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10dc0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10dd0 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10de0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10df0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10e00 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10e10 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10e20 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10e30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10e40 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10e50 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10e60 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10e70 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10e80 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10e90 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10ea0 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10eb0 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10ec0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10ed0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10ee0 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10ef0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10f00 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10f10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10f20 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10f30 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10f40 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10f50 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
10f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10f70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10f80 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
10f90 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
10fa0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
10fb0 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
10fc0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
10fd0 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
10fe0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
10ff0 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11000 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11010 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
11020 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
11030 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
11040 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
11050 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
11060 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
11070 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11080 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11090 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
110a0 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
110b0 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
110c0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
110d0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
110e0 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
110f0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11100 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11110 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
11120 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
11130 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
11140 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
11150 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
11160 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
11170 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11180 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11190 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
111a0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
111b0 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
111c0 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
111d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
111e0 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
111f0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11200 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11210 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11220 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
11230 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
11240 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
11250 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11260 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
11270 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11280 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11290 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
112a0 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  {.  sqlite3Backu
112b0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
112c0 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c  >pBackup);.  sql
112d0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
112e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
112f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
11300 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
11310 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
11320 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
11330 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
11340 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
11350 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
11360 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
11370 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
11380 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
11390 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
113a0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
113b0 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
113c0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
113d0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
113e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
113f0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
11400 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
11410 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
11420 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
11430 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
11440 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11450 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11460 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
11470 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11480 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11490 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
114a0 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
114b0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
114c0 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
114d0 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
114e0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
114f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11500 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
11510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
11520 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
11530 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
11540 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
11550 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
11560 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
11570 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
11580 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
11590 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
115a0 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
115b0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
115c0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
115d0 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
115e0 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
115f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
11600 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
11610 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
11620 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
11630 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
11640 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
11650 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
11660 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
11670 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
11680 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11690 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
116a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
116b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
116c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
116d0 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
116e0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
116f0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11700 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
11710 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
11720 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11730 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
11740 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
11750 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
11760 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
11770 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
11780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
117a0 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
117b0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
117c0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
117d0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
117e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
117f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11800 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
11810 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
11820 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11830 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e  de and not.** in
11840 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
11850 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
11860 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67  switches the pag
11870 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  er to PAGER_OPEN
11880 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  .** state..**.**
11890 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
118a0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
118b0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74  e-access mode, t
118c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
118d0 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c   is.** completel
118e0 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74  y unlocked. If t
118f0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
11900 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ked and the file
11910 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20  -system does.** 
11920 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20  not exhibit the 
11930 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11940 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20  _OPEN property, 
11950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11960 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69   is.** closed (i
11970 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a  f it is open)..*
11980 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11990 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74  r is in ERROR st
119a0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
119b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
119c0 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  , the .** conten
119d0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
119e0 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72  cache are discar
119f0 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63  ded before switc
11a00 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a  hing back to .**
11a10 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
11a20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
11a30 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72  hether the pager
11a40 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11a50 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c  -mode.** or not,
11a60 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   any journal fil
11a70 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
11a80 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62  le-system will b
11a90 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20  e treated.** as 
11aa0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
11ab0 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  d rolled back th
11ac0 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65  e next time a re
11ad0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  ad-transaction.*
11ae0 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20  * is opened (by 
11af0 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f  this or by any o
11b00 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  ther connection)
11b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
11b30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
11b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11b50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
11b60 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c  EADER .       ||
11b70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11b80 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20  =PAGER_OPEN .   
11b90 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11ba0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11bb0 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69  OR .  );..  sqli
11bc0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11bd0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
11be0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
11bf0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
11c00 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
11c10 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
11c20 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
11c30 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
11c40 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
11c50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
11c60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
11c70 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
11c80 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
11c90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
11ca0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
11cb0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
11cc0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11cd0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
11ce0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
11d00 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
11d10 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
11d20 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
11d30 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
11d40 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
11d50 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
11d60 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
11d70 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
11d80 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
11d90 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
11da0 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
11db0 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
11dc0 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
11dd0 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
11de0 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
11df0 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
11e00 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
11e10 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
11e20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
11e30 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
11e40 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
11e50 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
11e60 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
11e70 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11e80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11e90 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
11ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11eb0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ec0 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
11ed0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11ee0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11ef0 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
11f00 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11f10 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11f20 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
11f30 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11f40 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11f50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
11f60 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
11f70 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11f80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
11f90 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
11fa0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
11fb0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
11fc0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
11fd0 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
11fe0 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
11ff0 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
12000 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12010 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
12020 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
12030 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12040 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
12050 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12060 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
12070 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
12080 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
12090 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
120a0 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
120b0 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
120c0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
120d0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
120e0 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
120f0 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
12100 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
12110 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
12120 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
12130 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
12140 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
12150 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12160 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
12170 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12180 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
12190 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
121a0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
121b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
121c0 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
121d0 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
121e0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
121f0 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
12200 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
12210 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
12220 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
12230 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
12240 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
12250 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
12260 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
12270 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
12280 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
12290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
122a0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
122b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
122c0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
122d0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
122e0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
122f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12300 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
12310 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
12320 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
12330 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12340 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12350 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
12360 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
12370 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
12380 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
12390 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
123a0 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
123b0 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
123c0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
123d0 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
123e0 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
123f0 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
12400 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
12410 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
12420 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
12430 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
12440 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
12450 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
12460 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12470 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
12480 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
12490 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
124a0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
124b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
124c0 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
124d0 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
124e0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
124f0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
12500 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
12510 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12520 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12530 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12540 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12550 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12560 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12580 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12590 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
125a0 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
125b0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125c0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125d0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125e0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125f0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
12600 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
12610 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12620 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12630 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12640 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12650 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12660 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12670 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12680 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12690 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
126a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126b0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126c0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126e0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126f0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
12700 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
12710 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12720 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12730 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12740 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12750 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12760 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12770 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12780 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12790 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
127a0 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
127b0 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127c0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127d0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127e0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127f0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
12800 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
12810 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12820 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12830 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12840 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12850 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12860 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12870 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12880 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12890 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
128a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
128b0 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128c0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128d0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128e0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
12900 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
12910 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12920 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12930 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12940 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12950 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12960 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12970 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12980 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12990 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
129a0 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
129b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129d0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129f0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
12a00 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
12a10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a30 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a40 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a50 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a60 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a70 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a80 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a90 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12aa0 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12ab0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12ac0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ae0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12af0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12b00 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12b10 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b50 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b60 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b70 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b80 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b90 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12ba0 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12bb0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12bc0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12be0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bf0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12c00 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12c10 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c20 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c60 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c70 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c80 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c90 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12ca0 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12cb0 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12cc0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cd0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12ce0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cf0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12d00 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12d10 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d20 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d30 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d40 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d50 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d60 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d70 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d80 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d90 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12da0 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12db0 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12dc0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12dd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12de0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12df0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12e00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12e10 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e20 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e30 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e40 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e50 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e60 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e70 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e80 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12ea0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12eb0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ec0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12ed0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ee0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ef0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12f00 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12f10 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f20 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f30 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f40 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f60 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f70 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f80 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f90 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12fa0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12fb0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fd0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fe0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13000 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
13010 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13020 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13030 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13040 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13050 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13060 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13070 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13090 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
130a0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
130b0 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130c0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130e0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130f0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
13100 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
13110 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13120 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13130 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13140 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13150 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13160 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13170 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13180 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13190 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
131a0 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
131b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131c0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131d0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131e0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131f0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13200 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
13210 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13220 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13230 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13240 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13250 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13260 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13270 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13280 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13290 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
132a0 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
132b0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132c0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132e0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132f0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
13300 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13310 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13320 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13330 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13350 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13360 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13370 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13380 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13390 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
133a0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
133b0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133c0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133d0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133e0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133f0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13400 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
13410 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13420 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13430 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13440 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13450 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13460 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13470 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13480 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13490 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
134a0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
134b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134d0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134e0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134f0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
13500 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
13510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13530 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13540 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13550 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13560 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13570 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13580 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13590 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
135a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
135b0 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135c0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135d0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135f0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
13600 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
13610 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13620 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13630 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13640 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13650 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13660 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13670 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13680 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13690 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
136a0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
136b0 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136c0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136e0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136f0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
13700 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
13710 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13720 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13730 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13740 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13750 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13760 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13770 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13780 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13790 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
137a0 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
137b0 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137c0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137d0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137f0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
13800 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
13810 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13820 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13830 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13840 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13850 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13860 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13870 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13890 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
138a0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
138b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138c0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138d0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138e0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138f0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
13900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13910 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13920 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13930 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13940 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13950 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13960 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13970 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13980 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13990 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
139a0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
139b0 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
13a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
13a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a30 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a50 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a80 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a90 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13aa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13ac0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13b00 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13b10 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13b30 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
13b40 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
13b50 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
13b60 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73  e the new file s
13b70 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  ize is written i
13b80 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69  nto the inode ri
13b90 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20  ght away..      
13ba0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
13bb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
13bc0 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c  ht resurrect fol
13bd0 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c  lowing a power l
13be0 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  oss and.        
13bf0 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c    ** cause the l
13c00 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ast transaction 
13c10 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53  to roll back.  S
13c20 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ee.          ** 
13c30 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
13c40 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f  .mozilla.org/sho
13c50 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37  w_bug.cgi?id=107
13c60 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a  2773.          *
13c70 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
13c80 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
13c90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
13ca0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
13cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13cc0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13cd0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13d00 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13d10 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13d20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13d30 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13d50 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13d60 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13d70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13d80 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13d90 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13da0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13db0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13dd0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13de0 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13df0 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13e00 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13e10 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13e20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13e30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13e40 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13e50 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13e60 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13e70 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13e80 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13e90 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13ea0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13eb0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13ec0 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13ed0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13ee0 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13ef0 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13f00 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13f10 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13f20 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13f30 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13f40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13f50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13f60 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13f70 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13f80 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13f90 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13fa0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13fb0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13fc0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13fd0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13fe0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13ff0 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
14000 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
14010 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
14020 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
14030 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14040 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
14050 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
14060 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
14070 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14080 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
14090 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
140a0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
140b0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
140c0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
140d0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
140e0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
140f0 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
14100 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
14110 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
14120 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
14130 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Hdr *p = sqlite3
14140 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
14150 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  er, 1);.    if( 
14160 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61  p ){.      p->pa
14170 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  geHash = 0;.    
14180 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
14190 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20  refNotNull(p);. 
141a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
141b0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
141c0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
141d0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
141e0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
141f0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
14200 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
14210 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
14220 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
14230 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
14240 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
14250 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
14260 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
14270 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
14280 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
14290 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
142a0 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
142b0 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
142c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
142d0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
142e0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
142f0 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
14300 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
14310 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
14320 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
14330 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14340 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
14350 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
14360 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
14370 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
14380 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
14390 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
143a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
143b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
143c0 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
143d0 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
143e0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
143f0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14400 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14410 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14420 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14430 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
14440 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
14450 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
14460 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
14470 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
14480 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
14490 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
144a0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
144b0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
144c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
144d0 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
144e0 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
144f0 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14500 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14510 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14520 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14530 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
14540 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
14550 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
14560 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
14570 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
14580 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14590 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
145a0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
145b0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
145c0 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
145d0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
145e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
145f0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14600 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
14610 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
14620 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
14630 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
14640 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
14650 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
14660 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
14670 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
14680 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
14690 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
146a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
146b0 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
146c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
146d0 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
146e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
146f0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14700 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14710 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14720 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14730 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
14740 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14750 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14760 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14770 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14780 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14790 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
147a0 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
147b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
147c0 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
147d0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
147e0 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
147f0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14800 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14810 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14820 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14830 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14840 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14850 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14860 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14870 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14880 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14890 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
148a0 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
148b0 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
148c0 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
148d0 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
148e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
148f0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
14900 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14910 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14920 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14930 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
14940 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14950 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14960 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14970 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14980 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14990 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
149a0 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
149b0 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
149c0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
149d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
149e0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
149f0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
14a00 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
14a10 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14a20 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14a30 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
14a40 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14a50 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14a60 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14a70 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14a80 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14a90 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14aa0 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14ab0 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14ac0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14ad0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14ae0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
14af0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
14b00 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14b10 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14b20 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
14b30 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14b40 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14b50 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14b60 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14b70 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14b80 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14b90 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14bb0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14bc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14bd0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14be0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
14bf0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14c00 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
14c10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14c20 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
14c30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14c40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14c50 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14c60 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14c70 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14c80 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14c90 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
14ca0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
14cb0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
14cc0 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
14cd0 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
14ce0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
14cf0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
14d00 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
14d10 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
14d20 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
14d30 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
14d40 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
14d50 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14d60 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
14d70 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
14d80 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
14d90 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
14da0 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
14db0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
14dc0 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
14dd0 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
14de0 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
14df0 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
14e00 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
14e10 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
14e20 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
14e30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
14e40 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
14e50 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
14e60 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
14e70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
14e80 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
14e90 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
14ea0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
14eb0 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
14ec0 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
14ed0 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
14ee0 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
14ef0 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
14f00 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
14f10 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
14f20 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
14f30 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
14f40 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
14f50 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
14f60 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
14f70 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
14f80 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
14f90 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
14fa0 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
14fb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
14fc0 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
14fd0 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
14fe0 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
14ff0 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
15000 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
15010 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
15020 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
15030 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
15040 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
15050 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
15060 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
15070 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
15080 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
15090 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
150a0 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
150b0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
150c0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
150d0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
150e0 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
150f0 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
15100 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15110 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
15120 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
15130 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
15140 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
15150 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
15160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
15170 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
15180 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
15190 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
151a0 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
151b0 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
151c0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
151d0 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
151e0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
151f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15200 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
15210 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
15220 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
15230 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
15240 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
15250 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15270 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
15280 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
15290 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
152a0 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
152b0 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
152c0 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
152d0 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
152e0 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
152f0 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
15300 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
15310 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
15320 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
15330 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
15340 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
15350 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
15360 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
15370 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
15380 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
15390 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
153a0 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
153b0 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
153c0 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
153d0 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
153e0 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
153f0 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
15400 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
15410 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
15420 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
15430 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
15440 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
15450 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
15460 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15470 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
15480 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
15490 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
154a0 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
154b0 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
154c0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
154d0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
154e0 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
154f0 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
15500 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15520 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
15530 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
15540 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
15550 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
15560 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15570 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
15580 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
15590 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
155a0 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
155b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
155c0 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
155d0 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
155e0 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
155f0 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
15600 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
15610 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15620 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
15630 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
15640 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
15650 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15660 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
15670 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15680 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15690 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
156a0 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
156b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
156c0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
156d0 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
156e0 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
156f0 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
15700 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
15710 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15720 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
15730 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
15740 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
15750 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15760 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
15770 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
15780 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15790 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
157a0 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
157b0 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
157c0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
157d0 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
157e0 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
157f0 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
15800 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
15810 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15820 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
15830 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
15840 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
15850 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15860 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
15870 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
15880 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15890 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
158a0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
158b0 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
158c0 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
158d0 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
158e0 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
158f0 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
15900 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
15910 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15920 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
15930 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
15940 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
15950 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
15960 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
15970 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
15980 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15990 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
159a0 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
159b0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
159c0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
159d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
159e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
159f0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15a00 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
15a10 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
15a20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
15a30 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
15a40 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
15a50 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
15a60 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
15a70 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
15a80 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
15a90 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
15aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
15ab0 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
15ac0 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
15ad0 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
15ae0 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
15af0 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
15b00 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
15b10 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
15b20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b40 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
15b50 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
15b60 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
15b70 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b90 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
15ba0 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15bb0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
15be0 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
15bf0 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
15c00 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c20 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
15c30 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
15c40 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
15c50 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
15c60 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
15c70 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
15c80 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
15c90 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
15ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15cb0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15cc0 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
15cd0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
15ce0 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
15cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15d00 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
15d10 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
15d20 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
15d30 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
15d40 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
15d50 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
15d60 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
15d70 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
15d80 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
15d90 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
15da0 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
15db0 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
15dc0 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
15dd0 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
15de0 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
15df0 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
15e00 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
15e10 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
15e20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
15e30 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
15e40 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
15e50 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
15e60 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
15e70 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
15e80 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
15e90 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
15ea0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
15eb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15ec0 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
15ed0 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
15ee0 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
15ef0 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
15f00 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
15f10 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15f20 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
15f30 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
15f40 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15f50 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
15f60 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
15f70 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
15f80 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15f90 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
15fa0 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15fb0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
15fc0 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
15fd0 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
15fe0 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
15ff0 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
16000 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
16010 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
16020 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
16030 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
16040 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
16050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16060 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16070 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
16080 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
16090 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
160a0 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
160b0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
160c0 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
160d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
160e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
160f0 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
16100 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
16110 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
16120 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
16130 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
16140 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
16150 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
16160 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
16170 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
16180 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
16190 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
161a0 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
161b0 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
161c0 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
161d0 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
161e0 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
161f0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
16200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16210 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
16220 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16230 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
16240 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16250 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
16260 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16270 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16280 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
16290 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
162a0 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
162b0 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
162c0 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
162d0 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
162e0 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
162f0 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
16300 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
16310 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
16320 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
16330 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
16340 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
16350 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
16360 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
16370 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
16380 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
16390 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
163a0 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
163b0 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
163c0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
163d0 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
163e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
163f0 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
16400 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
16410 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
16420 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
16430 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16440 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
16450 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
16460 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
16470 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
16480 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
16490 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
164a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
164b0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
164c0 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
164d0 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
164e0 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
164f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
16500 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
16510 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16520 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
16530 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
16540 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
16550 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16570 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
16580 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16590 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72 65  played by before
165a0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
165b0 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
165c0 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
165d0 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
165e0 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
165f0 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16600 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16610 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16620 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16640 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16650 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16660 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16670 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16680 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16690 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
166a0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
166b0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
166c0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
166d0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
166e0 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
166f0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16700 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16710 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16720 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16730 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16740 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16750 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16760 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16770 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16780 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16790 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
167a0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
167b0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
167c0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
167d0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
167e0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
167f0 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16800 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16820 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16830 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16840 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16850 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16860 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16870 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16880 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16890 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
168a0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
168b0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
168c0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
168d0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
168e0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
168f0 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16900 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16910 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16920 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16930 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16940 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16950 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16960 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16970 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16980 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16990 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
169a0 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
169b0 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
169c0 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
169d0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
169e0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
169f0 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
16a00 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
16a10 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16a20 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
16a30 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
16a40 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
16a50 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
16a60 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16a70 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
16a80 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
16a90 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16aa0 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16ab0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
16ac0 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
16ad0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
16ae0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
16af0 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
16b00 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
16b10 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16b20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
16b30 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
16b40 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
16b50 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
16b60 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
16b70 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
16b80 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
16b90 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
16ba0 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
16bb0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
16bc0 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
16bd0 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
16be0 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
16bf0 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
16c00 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
16c10 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
16c20 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
16c30 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
16c40 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
16c50 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
16c60 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
16c70 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
16c80 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
16c90 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
16ca0 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
16cb0 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
16cc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
16cd0 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
16ce0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
16cf0 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
16d00 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
16d10 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
16d20 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
16d30 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
16d40 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
16d50 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
16d60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16d70 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
16d80 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
16d90 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
16da0 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
16db0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
16dc0 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
16dd0 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
16de0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16df0 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
16e00 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16e10 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
16e20 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
16e30 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
16e40 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
16e50 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
16e60 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
16e70 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
16e80 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16e90 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
16ea0 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
16eb0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
16ec0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
16ed0 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
16ee0 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
16ef0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
16f00 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
16f10 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
16f20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
16f30 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
16f40 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
16f50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16f60 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
16f70 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
16f80 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
16f90 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
16fa0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
16fb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16fc0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
16fd0 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
16fe0 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
16ff0 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
17000 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
17010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
17020 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
17030 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
17040 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
17050 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
17060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
17070 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
17080 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
17090 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
170a0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
170b0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
170c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
170d0 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
170e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
170f0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17100 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
17110 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
17120 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
17130 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
17140 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
17150 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
17160 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17170 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
17180 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
17190 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
171a0 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
171b0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
171c0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
171d0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
171e0 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
171f0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17200 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17210 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17220 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17230 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17240 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17250 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17260 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
17270 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
17280 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17290 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
172a0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
172b0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
172c0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
172d0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
172e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
172f0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17300 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17310 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17320 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17330 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
17340 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
17350 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
17360 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
17370 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
17380 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
17390 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
173a0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
173b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
173c0 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
173d0 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
173e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
173f0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
17400 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
17410 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
17420 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
17430 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
17440 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17450 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
17460 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
17470 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
17480 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
17490 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
174a0 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
174b0 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
174c0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
174d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
174e0 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
174f0 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
17500 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
17510 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
17520 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
17530 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
17540 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
17550 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
17560 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
17570 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
17580 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
17590 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
175a0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
175b0 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
175c0 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
175d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
175e0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
175f0 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
17600 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
17610 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
17620 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
17630 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
17640 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
17650 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
17660 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
17670 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
17680 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
17690 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
176a0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
176b0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
176c0 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
176d0 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
176e0 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
176f0 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
17700 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
17710 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
17720 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
17730 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
17740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
17750 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
17760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
17770 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
17780 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
17790 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
177a0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
177b0 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
177c0 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
177d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
177e0 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
177f0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
17800 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
17810 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17820 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
17830 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20  LBACK)!=0 );.   
17840 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17850 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
17860 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
17870 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17880 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
17890 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
178a0 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
178b0 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
178c0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
178d0 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
178e0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
178f0 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
17900 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
17910 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
17920 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
17930 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
17940 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
17950 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
17960 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
17970 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
17980 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
17990 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
179a0 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
179b0 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
179c0 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
179d0 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
179e0 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
179f0 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
17a00 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
17a10 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
17a20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
17a30 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
17a40 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
17a50 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
17a60 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  a, (u8*)aData, p
17a70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17a80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52  ;.    pPager->xR
17a90 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
17aa0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17ab0 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
17ac0 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
17ad0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
17ae0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
17af0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
17b00 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
17b10 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
17b20 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
17b30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
17b40 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
17b50 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
17b60 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
17b70 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
17b80 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
17b90 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
17ba0 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
17bb0 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
17bc0 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
17bd0 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
17be0 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
17bf0 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
17c00 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
17c10 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ase..      **.  
17c20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
17c30 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
17c40 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
17c50 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
17c60 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
17c70 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
17c80 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
17c90 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
17ca0 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
17cb0 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
17cc0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
17cd0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
17ce0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
17cf0 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
17d00 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
17d10 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
17d20 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
17d30 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
17d40 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
17d50 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
17d60 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17d70 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
17d80 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
17d90 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
17da0 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
17db0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
17dc0 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
17dd0 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
17de0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
17df0 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
17e00 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
17e10 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
17e20 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
17e30 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
17e40 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
17e50 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
17e60 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17e70 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
17e80 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
17e90 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
17ea0 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
17eb0 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
17ec0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17ed0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
17ee0 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
17ef0 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
17f00 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
17f10 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
17f20 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
17f30 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
17f40 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17f50 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
17f60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
17f70 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
17f80 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
17f90 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17fa0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
17fb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
17fc0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
17fd0 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
17fe0 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
17ff0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
18000 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
18010 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
18020 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
18030 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
18040 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
18050 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
18060 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
18070 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
18080 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
18090 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
180a0 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
180b0 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
180c0 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
180d0 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
180e0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
180f0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
18100 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
18110 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
18120 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
18130 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
18140 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
18150 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
18160 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
18170 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18180 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
18190 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
181a0 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
181b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
181c0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
181d0 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
181e0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
181f0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
18200 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
18210 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
18220 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
18230 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
18240 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
18250 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
18260 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
18270 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
18280 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
18290 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
182a0 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
182b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
182c0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
182d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
182e0 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
182f0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
18300 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
18310 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
18320 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
18330 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
18340 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
18350 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
18360 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
18370 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
18380 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
18390 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
183a0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
183b0 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
183c0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
183d0 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
183e0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
183f0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
18400 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
18410 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
18420 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
18430 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
18440 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
18450 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
18460 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
18470 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18480 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
18490 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
184a0 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
184b0 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
184c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
184d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
184e0 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
184f0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
18500 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
18510 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
18520 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
18530 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
18540 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
18550 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
18560 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
18570 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
18580 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
18590 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
185a0 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
185b0 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
185c0 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
185d0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
185e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
185f0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
18600 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
18610 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18620 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
18630 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
18640 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
18650 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
18660 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
18670 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
18680 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
18690 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
186a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
186b0 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
186c0 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
186d0 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
186e0 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
186f0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18700 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
18710 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
18720 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
18730 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
18740 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
18750 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
18760 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
18770 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
18780 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
18790 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
187a0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
187b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
187c0 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
187d0 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
187e0 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
187f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
18800 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
18810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
18820 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
18830 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
18840 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
18850 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
18860 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
18870 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
18880 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
18890 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
188a0 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
188b0 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
188c0 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
188d0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
188e0 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
188f0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
18900 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
18910 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
18920 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
18930 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
18940 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
18950 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
18960 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
18970 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
18980 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
18990 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
189a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
189b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
189c0 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
189d0 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
189e0 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
189f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
18a00 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
18a10 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
18a20 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
18a30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18a40 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
18a50 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
18a60 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
18a70 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
18a80 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
18a90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
18aa0 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
18ab0 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
18ac0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
18ad0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18ae0 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
18af0 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
18b00 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
18b10 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
18b20 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
18b30 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
18b40 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
18b50 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
18b60 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
18b70 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
18b80 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
18b90 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
18ba0 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
18bb0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
18bc0 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
18bd0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
18be0 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
18bf0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
18c00 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
18c10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
18c20 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
18c30 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
18c40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
18c50 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
18c60 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
18c70 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
18c80 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18c90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
18ca0 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
18cb0 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51   flags = .#if SQ
18cc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
18cd0 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
18ce0 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
18cf0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
18d00 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
18d10 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
18d20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
18d30 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18d40 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
18d50 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
18d60 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18d70 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
18d80 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
18d90 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
18da0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18db0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
18dc0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
18dd0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
18de0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
18df0 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
18e00 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  .  ** sqlite3_ma
18e10 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
18e20 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
18e30 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20  Journal.   Also 
18e40 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66  obtain.  ** suff
18e50 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e  icient space (in
18e60 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20   zMasterPtr) to 
18e70 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f  hold the names o
18e80 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f  f master.  ** jo
18e90 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72  urnal files extr
18ea0 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c  acted from regul
18eb0 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  ar rollback-jour
18ec0 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nals..  */.  rc 
18ed0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
18ee0 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
18ef0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
18f00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18f10 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
18f20 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74  ter_out;.  nMast
18f30 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
18f40 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d  Pathname+1;.  zM
18f50 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
18f60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61  qlite3Malloc(nMa
18f70 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
18f80 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
18f90 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
18fa0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
18fb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18fc0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
18fd0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61  r_out;.  }.  zMa
18fe0 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
18ff0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
19000 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72  rJournal+1];.  r
19010 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
19020 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
19030 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
19040 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
19050 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
19060 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
19070 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19080 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
19090 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
190a0 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20   0;..  zJournal 
190b0 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
190c0 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75  ;.  while( (zJou
190d0 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
190e0 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
190f0 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  nal ){.    int e
19100 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20  xists;.    rc = 
19110 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
19120 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
19130 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
19140 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
19150 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
19170 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19180 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
19190 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
191a0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
191b0 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
191c0 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
191d0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
191e0 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69  .      ** Open i
191f0 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
19200 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
19210 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
19220 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  If.      ** so, 
19230 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
19240 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
19250 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19260 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19270 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  int c;.      int
19280 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51   flags = .#if SQ
19290 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
192a0 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
192b0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73      (pPager->vfs
192c0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
192d0 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e  N_FILEPROTECTION
192e0 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20  _MASK)|.#endif. 
192f0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
19300 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19310 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
19320 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
19330 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
19340 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
19350 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
19360 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19370 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19380 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19390 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
193a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
193b0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
193c0 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
193d0 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
193e0 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
193f0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
19400 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
19410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19420 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19430 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19440 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
19450 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
19460 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
19470 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
19480 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
19490 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
194a0 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
194b0 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
194c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
194d0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
194e0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
194f0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
19500 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
19510 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
19520 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
19530 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
19540 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19550 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19560 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
19570 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
19580 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
19590 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
195a0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
195b0 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
195c0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
195d0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
195e0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
195f0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
19600 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
19610 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
19620 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
19630 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19640 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
19650 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
19660 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19670 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
19680 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
19690 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
196a0 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
196b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
196c0 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
196d0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
196e0 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
196f0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
19700 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
19710 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
19720 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
19730 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
19740 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
19750 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
19760 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
19770 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
19780 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
19790 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
197a0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
197b0 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
197c0 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
197d0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
197e0 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
197f0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
19800 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
19810 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
19820 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
19830 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
19840 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
19850 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
19860 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  r, it might be t
19870 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
19880 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
19890 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
198a0 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
198b0 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
198c0 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
198d0 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
198e0 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
198f0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
19900 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
19910 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
19920 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
19930 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
19940 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
19950 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
19960 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
19970 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
19980 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
19990 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
199a0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
199b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
199c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
199d0 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
199e0 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
199f0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
19a00 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
19a10 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
19a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19a30 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
19a40 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
19a50 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
19a60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19a70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19a80 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
19a90 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
19aa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
19ab0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
19ac0 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  .  .  if( isOpen
19ad0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  (pPager->fd) .  
19ae0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
19af0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
19b00 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
19b10 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
19b20 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20  _OPEN) .  ){.   
19b30 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
19b40 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69  , newSize;.    i
19b50 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
19b60 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19b70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19b80 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
19b90 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f  VE_LOCK );.    /
19ba0 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
19bb0 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
19bc0 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
19bd0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
19be0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
19bf0 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
19c00 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
19c10 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28  wSize = szPage*(
19c20 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
19c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19c40 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
19c50 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19c60 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
19c70 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
19c80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19c90 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
19ca0 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
19cb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19cc0 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73  ( (currentSize+s
19cd0 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20  zPage)<=newSize 
19ce0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
19cf0 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e  *pTmp = pPager->
19d00 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
19d10 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20     memset(pTmp, 
19d20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
19d30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
19d40 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d  ewSize-szPage) =
19d50 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b  = currentSize );
19d60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19d70 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
19d80 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69  ge) >  currentSi
19d90 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ze );.        rc
19da0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
19db0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  e(pPager->fd, pT
19dc0 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53  mp, szPage, newS
19dd0 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20  ize-szPage);.   
19de0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
19df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19e00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19e10 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
19e20 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
19e30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
19e40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
19e50 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76  rn a sanitized v
19e60 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65  ersion of the se
19e70 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20  ctor-size of OS 
19e80 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a  file pFile. The.
19e90 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
19ea0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
19eb0 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20   lie between 32 
19ec0 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  and MAX_SECTOR_S
19ed0 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IZE..*/.int sqli
19ee0 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71  te3SectorSize(sq
19ef0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
19f00 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d  e){.  int iRet =
19f10 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
19f20 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69  Size(pFile);.  i
19f30 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20  f( iRet<32 ){.  
19f40 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20    iRet = 512;.  
19f50 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d  }else if( iRet>M
19f60 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
19f70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
19f80 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
19f90 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d  12 );.    iRet =
19fa0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
19fc0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Ret;.}../*.** Se
19fd0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
19fe0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
19ff0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
1a000 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
1a010 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
1a020 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a030 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a040 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
1a050 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1a060 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
1a070 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1a080 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
1a090 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
1a0a0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
1a0b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
1a0c0 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
1a0d0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
1a0e0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
1a0f0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1a100 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
1a110 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
1a120 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a130 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
1a140 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
1a150 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
1a160 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a170 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a180 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
1a190 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1a1a0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1a1b0 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
1a1c0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
1a1d0 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
1a1e0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
1a1f0 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
1a200 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
1a210 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
1a220 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
1a230 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _SIZE..**.** If 
1a240 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65  the file has the
1a250 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1a260 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a270 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  E property, then
1a280 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65   set.** the effe
1a290 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a2a0 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d  e to its minimum
1a2b0 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54   value (512).  T
1a2c0 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a  he purpose of.**
1a2d0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1a2e0 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65  ize is to define
1a2f0 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69   the "blast radi
1a300 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61  us" of bytes tha
1a310 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1a320 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63  e if a crash occ
1a330 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e  urs while writin
1a340 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79  g to a single by
1a350 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61  te in.** that ra
1a360 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50  nge.  But with P
1a370 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a380 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61  TE, the blast ra
1a390 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  dius is zero.** 
1a3a0 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f  (that is what PO
1a3b0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a3c0 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20  E means), so we 
1a3d0 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63  minimize the sec
1a3e0 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f  tor.** size.  Fo
1a3f0 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
1a400 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  atibility of the
1a410 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a420 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a  l file format,.*
1a430 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75  * we cannot redu
1a440 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1a450 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c   sector size bel
1a460 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69  ow 512..*/.stati
1a470 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
1a480 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
1a490 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
1a4a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a4b0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1a4c0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
1a4d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a4e0 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
1a4f0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1a500 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1a510 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20  d) & .          
1a520 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1a530 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a540 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RITE)!=0.  ){.  
1a550 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
1a560 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
1a570 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1a580 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
1a590 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
1a5a0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
1a5b0 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
1a5c0 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
1a5d0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1a5e0 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
1a5f0 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ult. */.    pPag
1a600 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1a610 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   512;.  }else{. 
1a620 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a630 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53  rSize = sqlite3S
1a640 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1a650 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->fd);.  }.}../*
1a660 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
1a670 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
1a680 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
1a690 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
1a6a0 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
1a6b0 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
1a6c0 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
1a6d0 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
1a6e0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a6f0 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
1a700 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
1a710 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
1a720 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
1a730 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
1a740 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
1a750 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a760 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1a770 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
1a780 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
1a790 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
1a7a0 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
1a7b0 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1a7c0 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
1a7d0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
1a7e0 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
1a7f0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
1a800 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
1a810 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
1a820 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a830 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
1a840 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
1a850 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
1a860 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
1a870 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
1a880 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a890 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1a8a0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
1a8b0 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
1a8c0 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
1a8d0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
1a8e0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a8f0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a900 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1a910 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1a920 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1a930 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1a940 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1a950 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a960 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a970 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1a980 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1a990 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1a9a0 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1a9b0 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1a9c0 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1a9d0 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1a9e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1a9f0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1aa00 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1aa10 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1aa20 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1aa30 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1aa40 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1aa50 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1aa60 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1aa70 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1aa80 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1aa90 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1aaa0 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1aab0 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1aac0 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1aad0 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1aae0 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1aaf0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1ab00 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1ab10 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1ab20 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1ab30 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1ab40 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1ab50 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1ab60 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1ab70 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1ab80 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1ab90 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1aba0 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1abb0 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1abc0 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1abd0 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1abe0 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1abf0 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1ac00 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1ac10 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ac20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1ac30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1ac40 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1ac50 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1ac60 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1ac70 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1ac80 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1ac90 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1aca0 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1acb0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1acc0 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1acd0 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1ace0 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1acf0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1ad00 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1ad10 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1ad20 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1ad30 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1ad40 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1ad50 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1ad60 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1ad70 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1ad80 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1ad90 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1ada0 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1adb0 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1adc0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1add0 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1ade0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1adf0 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1ae00 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1ae10 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1ae20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1ae30 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1ae40 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1ae50 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1ae60 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1ae70 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1ae80 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1ae90 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1aea0 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1aeb0 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1aec0 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1aed0 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1aee0 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1aef0 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1af00 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1af10 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1af20 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1af30 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1af40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1af50 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1af60 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1af70 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1af80 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1af90 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1afa0 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1afb0 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1afc0 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1afd0 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1afe0 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1aff0 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1b000 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b010 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1b020 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1b030 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1b040 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1b050 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1b060 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1b070 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1b080 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1b090 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1b0a0 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1b0b0 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1b0c0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1b0d0 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1b0e0 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1b0f0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1b100 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1b110 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1b120 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1b130 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1b140 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1b150 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1b160 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1b170 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1b180 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1b190 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1b1a0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1b1b0 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1b1c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b1d0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1b1e0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b200 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b210 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1b220 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b240 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1b250 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1b260 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b280 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1b290 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1b2a0 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1b2b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b2c0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1b2d0 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1b2e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b300 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1b310 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b320 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1b330 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1b340 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1b350 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1b360 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1b370 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1b380 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1b390 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1b3a0 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1b3b0 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1b3c0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1b3d0 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1b3e0 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1b3f0 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  back */.  int nP
1b400 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20  layback = 0;    
1b410 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1b420 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74  er of pages rest
1b430 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ored from journa
1b440 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  l */..  /* Figur
1b450 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1b460 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1b470 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1b480 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1b490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1b4a0 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1b4b0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1b4c0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1b4d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1b4e0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1b4f0 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1b500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b510 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b520 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1b530 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1b540 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1b550 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b560 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1b570 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1b580 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b590 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1b5a0 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1b5b0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1b5c0 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1b5d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b5e0 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1b5f0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1b600 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1b610 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1b620 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1b630 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1b640 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1b650 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1b660 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1b670 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1b680 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1b690 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1b6a0 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1b6b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b6c0 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1b6d0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1b6e0 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1b6f0 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61  ,.  **  mxPathna
1b700 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1b710 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1b720 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1b730 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1b740 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1b750 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1b760 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1b770 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1b780 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1b790 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1b7a0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1b7b0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1b7c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b7d0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1b7e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1b7f0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1b800 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1b810 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1b820 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1b830 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1b840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b850 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1b860 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b870 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1b880 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1b890 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1b8a0 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1b8b0 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1b8c0 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1b8d0 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1b8e0 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1b8f0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1b900 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1b910 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1b920 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1b930 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1b940 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1b950 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1b960 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1b970 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1b980 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1b990 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1b9a0 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1b9b0 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1b9c0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1b9d0 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1b9e0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1b9f0 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1ba00 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1ba10 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1ba20 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1ba30 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1ba40 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1ba50 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1ba60 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1ba70 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1ba80 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1ba90 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1baa0 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1bab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bac0 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1bad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1bae0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1baf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bb00 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1bb10 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1bb20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1bb30 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1bb40 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1bb50 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1bb60 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1bb70 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1bb80 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1bb90 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1bba0 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1bbb0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1bbc0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1bbd0 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1bbe0 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1bbf0 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1bc00 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1bc10 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1bc20 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1bc30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bc40 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1bc50 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1bc60 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1bc70 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1bc80 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1bc90 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1bca0 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1bcb0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1bcc0 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1bcd0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1bce0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1bcf0 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1bd00 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1bd10 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1bd20 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1bd30 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1bd40 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1bd50 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1bd60 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1bd70 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1bd80 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1bd90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1bda0 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1bdb0 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1bdc0 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1bdd0 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1bde0 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1bdf0 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1be00 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1be10 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1be20 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1be30 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1be40 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1be50 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1be60 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1be70 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1be80 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1be90 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1bea0 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1beb0 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1bec0 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1bed0 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1bee0 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1bef0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1bf00 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1bf10 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1bf20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1bf30 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1bf40 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1bf50 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1bf60 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1bf70 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1bf80 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1bf90 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1bfa0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1bfb0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1bfc0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1bfd0 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1bfe0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1bff0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1c000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1c010 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1c020 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1c030 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1c040 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1c050 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1c060 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1c070 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1c080 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1c090 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1c0a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1c0b0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1c0c0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1c0d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1c0e0 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1c0f0 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1c100 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1c110 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1c120 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1c130 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1c140 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c150 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1c160 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1c170 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1c180 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1c190 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1c1a0 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1c1b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c1c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1c1d0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c1e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c1f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1c200 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1c210 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1c220 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1c230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1c240 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1c250 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c260 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1c270 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1c280 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1c290 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1c2a0 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1c2b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1c2c0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1c2d0 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1c2e0 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1c2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1c300 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c310 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1c320 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1c330 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1c340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1c360 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1c370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c390 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c3a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c3b0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1c3c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c3d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1c3e0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1c3f0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1c400 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1c410 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1c420 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1c430 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1c440 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1c450 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1c460 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1c470 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1c480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1c490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1c4a0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1c4b0 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1c4c0 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1c4d0 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1c4e0 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1c4f0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1c500 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1c510 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1c520 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1c530 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1c540 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1c550 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1c560 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1c570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c580 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1c590 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c5a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c5b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1c5c0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1c5d0 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1c5e0 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1c5f0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1c600 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1c610 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1c620 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1c630 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1c640 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1c650 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1c660 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1c670 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1c680 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1c690 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1c6a0 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1c6b0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1c6c0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1c6d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1c6e0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c6f0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c700 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c710 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1c720 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1c730 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1c740 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1c750 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1c760 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1c770 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1c780 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1c790 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1c7a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1c7b0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1c7c0 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1c7d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1c7e0 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1c7f0 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1c800 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1c810 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1c820 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c830 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1c840 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  fied..  */.#ifde
1c850 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1c860 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
1c870 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1c880 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1c890 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
1c8a0 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1c8b0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1c8c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1c8d0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1c8e0 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1c8f0 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1c900 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1c910 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1c920 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1c930 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1c940 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1c950 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1c960 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1c970 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1c980 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1c990 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1c9a0 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1c9b0 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1c9c0 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1c9d0 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1c9e0 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1c9f0 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1ca00 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1ca10 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1ca20 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1ca30 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1ca40 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1ca50 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ca60 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1ca70 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1ca80 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1ca90 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1caa0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1cab0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1cac0 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1cad0 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1cae0 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1caf0 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1cb00 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1cb10 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1cb20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1cb30 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1cb40 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1cb50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cb60 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1cb70 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1cb80 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1cb90 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1cba0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1cbb0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1cbc0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1cbd0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cbe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cbf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1cc00 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1cc10 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1cc20 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1cc30 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1cc40 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1cc50 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  N).  ){.    rc =
1cc60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1cc70 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
1cc80 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cc90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1cca0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1ccb0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1ccc0 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1ccd0 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61  , 0);.    testca
1cce0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1ccf0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cd00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cd10 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
1cd20 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
1cd30 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
1cd40 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
1cd50 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1cd60 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
1cd70 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1cd80 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1cd90 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1cda0 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
1cdb0 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
1cdc0 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
1cdd0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1cde0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1cdf0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1ce00 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e    if( isHot && n
1ce10 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20  Playback ){.    
1ce20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1ce30 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
1ce40 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63  R_ROLLBACK, "rec
1ce50 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20  overed %d pages 
1ce60 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20  from %s",.      
1ce70 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62            nPlayb
1ce80 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ack, pPager->zJo
1ce90 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  urnal);.  }..  /
1cea0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1ceb0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1cec0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1ced0 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1cee0 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1cef0 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1cf00 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1cf10 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1cf20 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1cf30 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1cf40 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1cf50 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1cf60 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1cf70 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1cf80 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1cf90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1cfa0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1cfb0 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1cfc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cfd0 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1cfe0 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1cff0 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1d000 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1d010 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d020 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1d030 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1d040 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1d050 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1d060 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1d070 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1d080 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1d090 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1d0a0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1d0b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1d0c0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1d0d0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1d0e0 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1d0f0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1d100 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1d110 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1d120 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1d130 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1d140 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75  ge(PgHdr *pPg, u
1d150 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61  32 iFrame){.  Pa
1d160 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1d170 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1d180 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1d190 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1d1a0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1d1b0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1d1c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1d1d0 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1d1e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d1f0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1d200 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1d210 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1d220 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1d230 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d240 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1d250 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d260 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1d270 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1d280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1d290 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1d2a0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1d2b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66  TE_OMIT_WAL.  if
1d2c0 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1d2d0 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1d2e0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1d2f0 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1d300 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1d310 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1d320 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1d330 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50  iFrame, pgsz, pP
1d340 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c  g->pData);.  }el
1d350 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1d360 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
1d370 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1d380 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1d390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d3a0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1d3b0 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1d3c0 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
1d3d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d3e0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d3f0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1d400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d410 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1d420 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1d430 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1d440 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1d450 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1d460 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1d470 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1d480 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1d490 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1d4a0 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1d4b0 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1d4c0 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1d4d0 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1d4e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d4f0 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1d500 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1d510 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1d520 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1d530 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d540 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1d550 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1d560 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1d570 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1d580 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1d590 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1d5a0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1d5b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1d5c0 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1d5d0 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1d5e0 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1d5f0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1d600 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1d610 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1d620 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1d630 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1d640 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1d650 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1d660 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1d670 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1d680 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1d690 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
1d6a0 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1d6b0 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1d6c0 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1d6d0 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1d6e0 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1d6f0 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1d700 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d710 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1d720 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1d730 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1d740 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1d750 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1d760 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1d770 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1d780 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d790 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1d7a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1d7b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1d7c0 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1d7d0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1d7e0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1d7f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
1d800 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1d810 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1d820 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1d830 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1d840 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1d850 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1d860 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1d870 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1d880 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1d890 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1d8a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d8b0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1d8c0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1d8d0 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1d8e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d8f0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1d900 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1d910 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1d920 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1d930 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1d940 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1d950 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1d960 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1d970 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1d980 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1d990 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1d9a0 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1d9b0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1d9c0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1d9d0 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1d9e0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d9f0 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1da00 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1da10 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1da20 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1da30 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1da40 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1da50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1da60 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1da70 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1da80 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1da90 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1daa0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1dab0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1dac0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1dad0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1dae0 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1daf0 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1db00 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1db10 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1db20 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1db30 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1db40 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1db50 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1db60 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1db70 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1db80 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1db90 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1dba0 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1dbb0 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1dbc0 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1dbd0 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1dbe0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1dbf0 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1dc00 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1dc10 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1dc20 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1dc30 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1dc40 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1dc50 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1dc60 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1dc70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dc80 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1dc90 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1dca0 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1dcb0 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1dcc0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1dcd0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1dce0 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1dcf0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1dd00 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1dd10 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1dd20 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1dd30 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1dd40 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1dd50 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1dd60 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1dd70 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1dd80 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1dd90 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1dda0 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1ddb0 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1ddc0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1ddd0 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1dde0 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1ddf0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1de00 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1de10 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1de20 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1de30 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1de40 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1de50 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1de60 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1de70 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1de80 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1de90 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1dea0 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1deb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1dec0 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1ded0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1dee0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1def0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1df00 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1df10 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1df20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1df30 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1df40 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1df50 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
1df60 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1df70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67  pPager) );.  pPg
1df80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
1df90 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
1dfa0 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
1dfb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1dfc0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
1dfd0 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
1dfe0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1dff0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
1e000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
1e010 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20   iFrame = 0;.   
1e020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1e030 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
1e040 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70  er->pWal, pPg->p
1e050 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
1e060 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e080 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1e090 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
1e0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e0b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e0c0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1e0d0 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1e0e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e0f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e100 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
1e110 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e120 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74  Normally, if a t
1e130 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1e140 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62  lled back, any b
1e150 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1e160 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  are.  ** updated
1e170 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69   as data is copi
1e180 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f  ed out of the ro
1e190 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1e1a0 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nd into the.  **
1e1b0 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
1e1c0 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79  is not generally
1e1d0 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61   possible with a
1e1e0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61   WAL database, a
1e1f0 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  s.  ** rollback 
1e200 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20  involves simply 
1e210 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c  truncating the l
1e220 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f  og file. Therefo
1e230 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  re, if one.  ** 
1e240 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68  or more frames h
1e250 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1e260 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1e270 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f  log (and therefo
1e280 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f  re .  ** also co
1e290 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61  pied into the ba
1e2a0 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20  ckup databases) 
1e2b0 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1e2c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a  transaction,.  *
1e2d0 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75  * the backups mu
1e2e0 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  st be restarted.
1e2f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
1e300 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
1e310 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a  ger->pBackup);..
1e320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e330 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e340 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1e350 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   rollback a tran
1e360 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c  saction on a WAL
1e370 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1e380 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f  atic int pagerRo
1e390 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20  llbackWal(Pager 
1e3a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e3b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e3d0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1e3e0 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20  PgHdr *pList;   
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e400 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79  /* List of dirty
1e410 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74   pages to revert
1e420 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c   */..  /* For al
1e430 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  l pages in the c
1e440 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75  ache that are cu
1e450 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72  rrently dirty or
1e460 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
1e470 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1e480 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74  (but not committ
1e490 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ed) to the log f
1e4a0 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74  ile, do one of t
1e4b0 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  he .  ** followi
1e4c0 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
1e4d0 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  + Discard the ca
1e4e0 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65  ched page (if re
1e4f0 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20  fcount==0), or. 
1e500 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70   **   + Reload p
1e510 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  age content from
1e520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
1e530 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20  f refcount>0).. 
1e540 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
1e550 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1e560 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20  bOrigSize;.  rc 
1e570 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f  = sqlite3WalUndo
1e580 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1e590 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1e5a0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1e5b0 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
1e5c0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1e5d0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1e5e0 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  che);.  while( p
1e5f0 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1e600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1e610 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1e620 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1e630 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1e640 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1e650 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1e660 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1e670 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1e680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e690 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e6a0 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1e6b0 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1e6c0 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1e6d0 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1e6e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1e6f0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1e700 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1e710 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1e720 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1e730 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1e740 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1e750 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1e760 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1e770 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1e780 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1e790 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1e7a0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1e7b0 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
1e7c0 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1e7d0 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
1e7e0 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
1e7f0 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
1e800 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
1e810 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
1e820 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e830 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1e840 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e860 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1e870 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1e8a0 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1e8b0 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1e8e0 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1e8f0 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1e900 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1e910 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e920 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1e930 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
1e940 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e960 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e970 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e9a0 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a  ges in pList */.
1e9b0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1e9c0 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1e9d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43  ined(SQLITE_CHEC
1e9e0 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48 64 72  K_PAGES).  PgHdr
1e9f0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1ea00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1ea10 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
1ea20 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ages */.#endif..
1ea30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ea40 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
1ea50 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
1ea60 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ea70 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1ea80 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
1ea90 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
1eaa0 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
1eab0 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
1eac0 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
1ead0 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
1eae0 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
1eaf0 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
1eb00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1eb10 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72  ert( pList->pDir
1eb20 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69  ty==0 || isCommi
1eb30 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d  t );.  if( isCom
1eb40 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mit ){.    /* If
1eb50 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1eb60 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  on is being comm
1eb70 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  itted, there is 
1eb80 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
1eb90 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70  ing.    ** any p
1eba0 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e  ages with page n
1ebb0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
1ebc0 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e  han nTruncate in
1ebd0 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  to the WAL file.
1ebe0 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c  .    ** They wil
1ebf0 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  l never be read 
1ec00 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53  by any client. S
1ec10 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  o remove them fr
1ec20 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20  om the pDirty.  
1ec30 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20    ** list here. 
1ec40 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  */.    PgHdr *p;
1ec50 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e  .    PgHdr **ppN
1ec60 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20  ext = &pList;.  
1ec70 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    nList = 0;.   
1ec80 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a   for(p=pList; (*
1ec90 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20  ppNext = p)!=0; 
1eca0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1ecb0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1ecc0 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1ecd0 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1ece0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1ecf0 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1ed00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1ed10 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1ed20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
1ed30 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
1ed40 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
1ed50 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
1ed60 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
1ed70 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1ed80 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1ed90 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1eda0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1edb0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1edc0 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1edd0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1ede0 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1edf0 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
1ee00 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
1ee10 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1ee20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1ee30 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
1ee40 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1ee50 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1ee60 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ee70 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
1ee80 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
1ee90 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67  ->pBackup, p->pg
1eea0 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61  no, (u8 *)p->pDa
1eeb0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1eec0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1eed0 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73  ECK_PAGES.  pLis
1eee0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1eef0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1ef00 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66  r->pPCache);.  f
1ef10 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1ef20 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1ef30 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
1ef40 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  ash(p);.  }.#end
1ef50 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
1ef60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
1ef70 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
1ef80 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a  on on the WAL..*
1ef90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1efa0 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c  e used to be cal
1efb0 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e  led "pagerOpenSn
1efc0 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73  apshot()" becaus
1efd0 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79  e it essentially
1efe0 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70  .** makes a snap
1eff0 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61  shot of the data
1f000 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72  base at the curr
1f010 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  ent point in tim
1f020 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a  e and preserves.
1f030 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  ** that snapshot
1f040 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1f050 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20  reader in spite 
1f060 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20  of concurrently 
1f070 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74  changes by.** ot
1f080 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63  her writers or c
1f090 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  heckpointers..*/
1f0a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f0b0 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
1f0c0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
1f0d0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f100 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1f110 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20  changed = 0;    
1f120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f130 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73  rue if cache mus
1f140 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20  t be reset */.. 
1f150 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1f160 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1f170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f180 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f190 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
1f1a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
1f1b0 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71  ADER );..  /* sq
1f1c0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1f1d0 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73  ransaction() was
1f1e0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20   not called for 
1f1f0 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a  the previous.  *
1f200 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  * transaction in
1f210 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
1f220 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c  CLUSIVE.  So cal
1f230 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65  l it now.  If we
1f240 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63  .  ** are in loc
1f250 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c  king_mode=NORMAL
1f260 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77   and EndRead() w
1f270 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  as previously ca
1f280 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64  lled,.  ** the d
1f290 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73  uplicate call is
1f2a0 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
1f2b0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
1f2c0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1f2d0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1f2e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1f2f0 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1f300 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1f310 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20  l, &changed);.  
1f320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f330 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a  K || changed ){.
1f340 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1f350 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1f360 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
1f370 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ) ) sqlite3OsUnf
1f380 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
1f390 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
1f3a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1f3b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
1f3c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1f3d0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1f3e0 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1f3f0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74   PAGER_OPEN.** t
1f400 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
1f410 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  tate to determin
1f420 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1f430 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1f440 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73  ** in pages (ass
1f450 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  uming the page s
1f460 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ize currently st
1f470 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61  ored in Pager.pa
1f480 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  geSize)..**.** I
1f490 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1f4a0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1f4b0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1f4c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f4d0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65  abase.** in page
1f4e0 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  s is stored in *
1f4f0 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73  pnPage. Otherwis
1f500 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
1f510 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c   (perhaps.** SQL
1f520 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
1f530 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f540 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
1f550 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a   unmodified..*/.
1f560 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f570 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1f580 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70  *pPager, Pgno *p
1f590 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1f5a0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1f5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1f5c0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
1f5d0 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
1f5e0 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20  * Query the WAL 
1f5f0 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  sub-system for t
1f600 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f610 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28  . The WalDbsize(
1f620 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ).  ** function 
1f630 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  returns zero if 
1f640 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f  the WAL is not o
1f650 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e  pen (i.e. Pager.
1f660 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  pWal==0), or.  *
1f670 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1f680 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76  e size is not av
1f690 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74  ailable. The dat
1f6a0 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1f6b0 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  t.  ** available
1f6c0 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1f6d0 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20  b-system if the 
1f6e0 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74  log file is empt
1f6f0 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  y or.  ** contai
1f700 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d  ns no valid comm
1f710 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
1f720 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ns..  */.  asser
1f730 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1f740 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1f750 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f760 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1f770 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65  _LOCK );.  nPage
1f780 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
1f790 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
1f7a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1f7b0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1f7c0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
1f7d0 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
1f7e0 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65  -system,.  ** de
1f7f0 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64  termine it based
1f800 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20   on the size of 
1f810 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f820 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20  e. If the size. 
1f830 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
1f840 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
1f850 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
1f860 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
1f870 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64  size,.  ** round
1f880 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61   down to the nea
1f890 72 65 73 74 20 70 61 67 65 2e 20 45 78 63 65 70  rest page. Excep
1f8a0 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67  t, any file larg
1f8b0 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62  er than 0.  ** b
1f8c0 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20  ytes in size is 
1f8d0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f  considered to co
1f8e0 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f  ntain at least o
1f8f0 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ne page..  */.  
1f900 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1f910 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
1f940 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1f950 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
1f960 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1f970 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1f980 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
1f990 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1f9a0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
1f9b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1f9c0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1f9d0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  , &n);.      if(
1f9e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f9f0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fa00 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1fa10 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
1fa20 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d  Pgno)((n+pPager-
1fa30 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70  >pageSize-1) / p
1fa40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1fa50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1fa60 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1fa70 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fa80 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
1fa90 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
1faa0 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
1fab0 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
1fac0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
1fad0 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
1fae0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
1faf0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
1fb00 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
1fb10 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1fb20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1fb30 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
1fb40 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
1fb50 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1fb60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fb70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1fb80 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1fb90 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
1fba0 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
1fbb0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1fbc0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1fbd0 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
1fbe0 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
1fbf0 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
1fc00 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
1fc10 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fc20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
1fc30 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
1fc40 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
1fc50 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
1fc60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1fc70 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1fc80 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
1fc90 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
1fca0 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
1fcb0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
1fcc0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1fcd0 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
1fce0 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
1fcf0 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
1fd00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
1fd10 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
1fd20 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
1fd30 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
1fd40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1fd50 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
1fd60 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
1fd70 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1fd80 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1fd90 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
1fda0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1fdb0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
1fdc0 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
1fdd0 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
1fde0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1fdf0 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
1fe00 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
1fe10 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
1fe20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
1fe30 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
1fe40 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
1fe50 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
1fe60 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
1fe70 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
1fe80 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
1fe90 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
1fea0 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
1feb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1fec0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1fed0 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
1fee0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1fef0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ff00 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1ff10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1ff20 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1ff30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ff40 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1ff50 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  OCK );..  if( !p
1ff60 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1ff70 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
1ff80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ff90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ffa0 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
1ffb0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  */.    Pgno nPag
1ffc0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ffd0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ffe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fff0 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70  e */..    rc = p
20000 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
20010 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
20020 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20030 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e  rn rc;.    if( n
20040 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
20050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
20060 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
20070 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
20080 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20090 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
200a0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20  _DELETE_NOENT ) 
200b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
200c0 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b        isWal = 0;
200d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
200e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
200f0 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
20100 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20    pPager->pVfs, 
20110 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51  pPager->zWal, SQ
20120 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
20130 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20  TS, &isWal.     
20140 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
20150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20160 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57  ){.      if( isW
20170 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  al ){.        te
20180 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50  stcase( sqlite3P
20190 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
201a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
201b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
201c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
201d0 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
201e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
201f0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
20200 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
20210 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
20220 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
20230 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
20240 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20250 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
20260 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20270 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
20280 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
20290 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
202a0 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
202b0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
202c0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
202d0 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
202e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
202f0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
20300 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
20310 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
20320 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
20330 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
20340 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
20350 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
20360 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
20370 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
20380 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
20390 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
203a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
203b0 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
203c0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
203d0 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
203e0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
203f0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
20400 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
20410 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
20420 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
20430 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
20440 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
20450 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
20460 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
20470 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
20480 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
20490 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
204a0 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
204b0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
204c0 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
204d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
204e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
204f0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
20500 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20510 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
20520 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
20530 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20540 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
20550 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
20560 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
20570 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
20580 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
20590 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
205a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
205b0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
205c0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
205d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
205e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
205f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
20600 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
20610 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
20620 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
20630 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
20640 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
20650 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
20660 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
20670 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
20680 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
20690 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
206a0 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
206b0 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
206c0 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
206d0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
206e0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
206f0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
20700 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
20710 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
20720 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
20730 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
20740 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
20750 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
20760 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
20770 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
20780 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
20790 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
207a0 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
207b0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
207c0 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
207d0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
207e0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
207f0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
20800 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
20810 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
20820 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
20830 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
20840 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
20850 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
20860 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
20870 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
20880 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
20890 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
208a0 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
208b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
208c0 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
208d0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
208e0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
208f0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
20900 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
20910 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
20920 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
20930 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
20940 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
20950 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
20960 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
20970 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
20980 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
20990 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
209a0 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
209c0 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
209d0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
209e0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
209f0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
20a00 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
20a10 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
20a20 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
20a30 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
20a40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
20a50 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
20a60 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
20a70 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
20a80 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
20a90 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
20aa0 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
20ab0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
20ac0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
20ad0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
20ae0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20af0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
20b00 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f  R_LOCKED );..  /
20b10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
20b20 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
20b30 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
20b40 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
20b50 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
20b60 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
20b70 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
20b80 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
20b90 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
20ba0 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
20bb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20bc0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
20bd0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
20be0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
20bf0 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
20c00 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
20c10 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
20c20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
20c30 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
20c40 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
20c50 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
20c60 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
20c70 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
20c80 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61  bOrigSize;.  pPa
20c90 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
20ca0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
20cb0 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
20cc0 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70  !pSavepoint && p
20cd0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20ce0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
20cf0 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
20d00 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
20d10 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
20d20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
20d30 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
20d40 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
20d50 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
20d60 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
20d70 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
20d80 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
20d90 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
20da0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
20db0 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
20dc0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
20dd0 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
20de0 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
20df0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
20e00 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
20e10 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
20e20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
20e40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
20e50 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a  =0 || szJ==0 );.
20e60 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
20e70 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
20e80 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
20e90 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
20ea0 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
20eb0 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
20ec0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
20ed0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
20ee0 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
20ef0 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
20f00 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
20f10 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
20f20 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
20f30 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
20f40 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
20f50 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
20f60 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
20f70 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
20f80 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
20f90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
20fa0 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
20fb0 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
20fc0 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
20fd0 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
20fe0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26  f( pSavepoint &&
20ff0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
21000 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64  ager) ){.    iHd
21010 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  rOff = pSavepoin
21020 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20  t->iHdrOffset ? 
21030 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
21040 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20  Offset : szJ;.  
21050 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21060 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  lOff = pSavepoin
21070 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  t->iOffset;.    
21080 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21090 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
210a0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f  journalOff<iHdrO
210b0 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ff ){.      rc =
210c0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
210d0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
210e0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
210f0 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
21100 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21110 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21120 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
21130 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
21140 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
21150 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
21160 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
21170 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
21180 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21190 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
211a0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
211b0 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
211c0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
211d0 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
211e0 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
211f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
21200 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
21210 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
21220 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
21230 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
21240 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
21250 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
21260 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
21270 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
21280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
21290 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
212a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
212b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
212c0 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
212d0 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
212e0 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
212f0 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
21300 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
21310 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
21320 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e  ager, 0, szJ, &n
21330 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
21340 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
21350 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
21360 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
21370 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
21380 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
21390 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
213a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
213b0 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
213c0 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
213d0 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
213e0 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
213f0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
21400 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
21410 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
21420 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
21430 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21440 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
21450 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21460 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
21470 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
21480 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
21490 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
214a0 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
214b0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
214c0 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
214d0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
214e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
214f0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21500 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
21510 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21520 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
21530 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
21540 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21550 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
21560 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
21570 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
21580 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21590 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
215a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
215b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
215c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
215d0 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff>=szJ );..  /*
215e0 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
215f0 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
21600 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
21610 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
21620 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
21630 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
21640 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21650 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
21660 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
21670 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
21680 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
21690 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
216a0 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
216b0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
216c0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
216d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
216e0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
216f0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36  i64 offset = (i6
21700 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  4)pSavepoint->iS
21710 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
21720 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
21730 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
21740 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
21760 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70  lSavepointUndo(p
21770 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61  Pager->pWal, pSa
21780 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74  vepoint->aWalDat
21790 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  a);.    }.    fo
217a0 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
217b0 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
217c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
217d0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
217e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
217f0 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34  rt( offset==(i64
21800 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  )ii*(4+pPager->p
21810 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20  ageSize) );.    
21820 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21830 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21840 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20  Pager, &offset, 
21850 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  pDone, 0, 1);.  
21860 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21870 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21880 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
21890 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
218a0 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Done);.  if( rc=
218b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
218c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
218d0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  lOff = szJ;.  }.
218e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
218f0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
21900 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
21910 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
21920 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
21930 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
21940 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
21950 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
21960 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
21970 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
21980 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
21990 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
219a0 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
219b0 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f  * Invoke SQLITE_
219c0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20  FCNTL_MMAP_SIZE 
219d0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72  based on the cur
219e0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a  rent value of sz
219f0 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Mmap..*/.static 
21a00 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70  void pagerFixMap
21a10 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  limit(Pager *pPa
21a20 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  ger){.#if SQLITE
21a30 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
21a40 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21a50 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64  *fd = pPager->fd
21a60 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66  ;.  if( isOpen(f
21a70 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f  d) && fd->pMetho
21a80 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
21a90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
21aa0 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20  nt64 sz;.    sz 
21ab0 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70  = pPager->szMmap
21ac0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55  ;.    pPager->bU
21ad0 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29  seFetch = (sz>0)
21ae0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
21af0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
21b00 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
21b10 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
21b20 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e  E, &sz);.  }.#en
21b30 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dif.}../*.** Cha
21b40 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
21b50 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f  size of any memo
21b60 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20  ry mapping made 
21b70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21b80 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
21b90 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
21ba0 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  pLimit(Pager *pP
21bb0 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ager, sqlite3_in
21bc0 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70  t64 szMmap){.  p
21bd0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
21be0 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46  szMmap;.  pagerF
21bf0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
21c00 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
21c10 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
21c20 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
21c30 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
21c40 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21c50 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
21c60 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
21c70 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
21c80 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
21c90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
21ca0 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20  settings of the 
21cb0 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73  pager to those s
21cc0 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
21cd0 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  pgFlags paramete
21ce0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65  r..**.** The "le
21cf0 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20  vel" in pgFlags 
21d00 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
21d10 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68  OUS_MASK sets th
21d20 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20  e robustness.** 
21d30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21d40 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
21d50 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70   OS crashes or p
21d60 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
21d70 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65  .** changing the
21d80 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
21d90 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
21da0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   the journals..*
21db0 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  * There are thre
21dc0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
21dd0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
21de0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
21df0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
21e00 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
21e10 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
21e20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
21e30 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
21e40 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
21e50 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
21e60 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
21e70 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
21e80 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
21e90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
21ea0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
21eb0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
21ec0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
21ed0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
21ee0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
21ef0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
21f00 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
21f10 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
21f20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
21f30 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
21f40 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
21f50 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
21f60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21f70 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
21f80 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
21f90 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
21fa0 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
21fb0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
21fc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
21fd0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
21fe0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
21ff0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
22000 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
22010 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
22020 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
22030 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
22040 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
22050 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
22060 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
22070 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
22080 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
22090 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
220a0 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
220b0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
220c0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
220d0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
220e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
220f0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
22100 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
22110 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
22120 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
22130 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
22140 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
22150 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
22160 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
22170 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
22180 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
22190 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
221a0 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
221b0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
221c0 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
221d0 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
221e0 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
221f0 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
22200 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
22210 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
22220 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
22230 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
22240 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
22250 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
22260 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
22270 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
22280 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
22290 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
222a0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
222b0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
222c0 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
222d0 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
222e0 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
222f0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
22300 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
22310 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
22320 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
22330 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
22340 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
22350 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
22360 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
22370 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
22380 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
22390 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
223a0 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
223b0 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
223c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
223d0 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f  NORMAL..**.** Do
223e0 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
223f0 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
22400 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
22410 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
22420 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
22430 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
22440 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
22450 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
22460 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
22470 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
22480 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
22490 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
224a0 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
224b0 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
224c0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
224d0 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
224e0 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
224f0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22500 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
22510 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
22520 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
22530 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
22540 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
22550 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
22560 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
22570 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
22580 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
22590 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
225a0 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
225b0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
225c0 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
225d0 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
225e0 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
225f0 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
22600 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
22610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22620 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
22630 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22640 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67  rSetFlags(.  Pag
22650 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
22660 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
22670 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
22680 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73  vel for */.  uns
22690 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
226a0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
226b0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ags */.){.  unsi
226c0 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46  gned level = pgF
226d0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
226e0 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20  CHRONOUS_MASK;. 
226f0 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d   assert( level>=
22700 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b  1 && level<=3 );
22710 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
22720 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c  c =  (level==1 |
22730 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
22740 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
22750 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
22760 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
22770 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
22780 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1:0;.  if( pPage
22790 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
227a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
227b0 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  gs = 0;.    pPag
227c0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
227d0 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  s = 0;.  }else i
227e0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
227f0 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  ER_FULLFSYNC ){.
22800 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22810 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22820 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
22830 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22840 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22850 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
22860 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22870 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59  GER_CKPT_FULLFSY
22880 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
22890 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
228a0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
228b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
228c0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
228d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
228e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
228f0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
22900 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22910 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
22920 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
22930 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22940 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
22950 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
22960 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
22970 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
22980 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
22990 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
229a0 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
229b0 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
229c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c  ;.  }.  if( pgFl
229d0 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48  ags & PAGER_CACH
229e0 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50  ESPILL ){.    pP
229f0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
22a00 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f   &= ~SPILLFLAG_O
22a10 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FF;.  }else{.   
22a20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
22a30 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
22a40 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  _OFF;.  }.}.#end
22a50 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
22a60 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
22a70 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
22a80 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
22a90 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
22aa0 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
22ab0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
22ac0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
22ad0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
22ae0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
22af0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
22b00 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
22b10 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
22b20 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
22b30 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
22b40 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
22b50 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
22b60 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
22b70 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
22b80 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
22b90 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
22ba0 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
22bb0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
22bc0 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
22bd0 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
22be0 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
22bf0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
22c00 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
22c10 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
22c20 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
22c30 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
22c40 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
22c50 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
22c60 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
22c70 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
22c80 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
22c90 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
22ca0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22cb0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
22cc0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
22cd0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22ce0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
22cf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
22d00 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
22d10 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
22d20 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
22d30 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22d40 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
22d50 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
22d60 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
22d70 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22d80 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
22d90 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
22da0 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
22db0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
22dc0 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
22dd0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22df0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
22e00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22e10 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
22e20 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
22e30 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
22e40 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
22e50 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
22e60 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
22e70 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
22e80 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
22e90 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ON.            (
22ea0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
22eb0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c  &SQLITE_OPEN_FIL
22ec0 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b  EPROTECTION_MASK
22ed0 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  )|.#endif.      
22ee0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22ef0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
22f00 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
22f10 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
22f20 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
22f30 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
22f40 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
22f50 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22f60 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
22f70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
22f80 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
22f90 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22fa0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
22fb0 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
22fc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
22fd0 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
22fe0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
22ff0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
23000 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
23010 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
23020 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
23030 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
23040 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
23050 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
23060 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
23070 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
23080 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
23090 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
230a0 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
230b0 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
230c0 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
230d0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
230e0 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
230f0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
23100 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
23110 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
23120 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
23130 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
23140 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
23150 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
23160 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
23170 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
23180 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
231b0 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
231c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
231d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
231e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
231f0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
23200 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
23210 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
23220 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
23230 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
23240 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
23250 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
23260 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
23270 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
23280 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
23290 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
232a0 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
232b0 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
232c0 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
232d0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
232e0 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
232f0 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
23300 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
23310 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
23320 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
23330 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
23340 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
23350 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
23360 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
23370 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
23380 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
23390 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
233a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
233b0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
233c0 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
233d0 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
233e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
233f0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
23400 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
23410 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
23420 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
23430 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
23440 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
23450 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  dler */.){.  pPa
23460 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
23470 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
23480 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
23490 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
234a0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a  usyHandlerArg;..
234b0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
234c0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
234d0 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69  void **ap = (voi
234e0 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42  d **)&pPager->xB
234f0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
23500 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29  assert( ((int(*)
23510 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29  (void *))(ap[0])
23520 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20  )==xBusyHandler 
23530 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
23540 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c  p[1]==pBusyHandl
23550 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c  erArg );.    sql
23560 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
23570 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
23580 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42  , SQLITE_FCNTL_B
23590 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69  USYHANDLER, (voi
235a0 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  d *)ap);.  }.}..
235b0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
235c0 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
235d0 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
235e0 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
235f0 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
23600 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
23610 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
23620 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
23630 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
23640 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
23650 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
23660 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
23670 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
23680 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
23690 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
236a0 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
236b0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20  QLITE_IOERR, an 
236c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78  SQLITE_IOERR_xxx
236d0 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c   sub-code or SQL
236e0 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
236f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
23700 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
23710 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
23720 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
23730 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
23740 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
23750 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
23760 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
23770 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
23780 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
23790 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
237a0 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
237b0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
237c0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
237d0 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
237e0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
237f0 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
23800 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
23810 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
23820 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
23830 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
23840 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
23850 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
23860 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
23870 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
23880 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
23890 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
238a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
238b0 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
238c0 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
238d0 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
238e0 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
238f0 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
23900 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
23910 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
23920 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
23930 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
23940 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
23950 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
23960 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
23970 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
23980 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
23990 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
239a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
239b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
239c0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
239d0 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
239e0 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
239f0 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
23a00 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
23a10 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
23a20 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
23a30 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
23a40 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
23a50 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
23a60 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
23a70 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
23a80 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
23a90 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
23aa0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
23ab0 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
23ac0 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
23ad0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
23ae0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
23af0 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
23b00 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50  *pPager, u32 *pP
23b10 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
23b20 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
23b30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
23b40 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
23b50 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66  ssible to do a f
23b60 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72  ull assert_pager
23b70 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61  _state() here, a
23b80 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
23b90 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
23ba0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50  ed from within P
23bb0 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f  agerOpen(), befo
23bc0 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  re the state.  *
23bd0 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  * of the Pager o
23be0 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61  bject is interna
23bf0 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
23c00 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65    **.  ** At one
23c10 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63   point this func
23c20 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e  tion returned an
23c30 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61   error if the pa
23c40 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a  ger was in .  **
23c50 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
23c60 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41  te. But since PA
23c70 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20  GER_ERROR state 
23c80 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
23c90 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74    ** there is at
23ca0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
23cb0 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
23cc0 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63  rence, this func
23cd0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e  tion.  ** is a n
23ce0 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61  o-op for that ca
23cf0 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a  se anyhow..  */.
23d00 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20  .  u32 pageSize 
23d10 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
23d20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
23d30 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
23d40 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
23d50 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
23d60 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66  GE_SIZE) );.  if
23d70 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
23d80 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
23d90 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20  bSize==0).   && 
23da0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
23db0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
23dc0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26  Cache)==0 .   &&
23dd0 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
23de0 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67  eSize!=(u32)pPag
23df0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
23e00 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
23e10 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  w = NULL;       
23e20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d        /* New tem
23e30 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  p space */.    i
23e40 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20  64 nByte = 0;.. 
23e50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
23e60 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
23e70 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
23e80 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
23e90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
23ea0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
23eb0 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
23ec0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
23ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23ee0 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29   pNew = (char *)
23ef0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
23f00 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
23f10 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
23f20 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23f30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
23f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23f50 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
23f60 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
23f70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23f80 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
23f90 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23fa0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
23fb0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23fd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
23fe0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
23ff0 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ace);.      pPag
24000 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
24010 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67  pNew;.      pPag
24020 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67  er->dbSize = (Pg
24030 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53  no)((nByte+pageS
24040 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29  ize-1)/pageSize)
24050 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
24060 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
24070 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
24080 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24090 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
240a0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65   }.  }..  *pPage
240b0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
240c0 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72  ageSize;.  if( r
240d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
240e0 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
240f0 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
24100 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
24110 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
24120 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
24130 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
24140 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
24150 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
24160 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
24170 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
24180 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70  .    pagerFixMap
24190 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  limit(pPager);. 
241a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
241b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
241c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
241d0 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
241e0 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
241f0 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
24200 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
24210 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
24220 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
24230 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
24240 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
24250 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
24260 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
24270 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
24280 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
24290 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
242a0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
242b0 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
242c0 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
242d0 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
242e0 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
242f0 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
24300 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
24310 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
24320 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
24330 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
24340 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24350 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24360 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
24370 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
24380 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
24390 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
243a0 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
243b0 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
243c0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
243d0 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
243e0 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
243f0 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
24400 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
24410 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
24420 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
24430 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
24440 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
24450 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
24460 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
24470 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
24480 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
24490 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
244a0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
244b0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
244c0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
244d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
244e0 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
244f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
24500 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
24510 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20  ER_OPEN );      
24520 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62  /* Called only b
24530 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f  y OP_MaxPgcnt */
24540 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24550 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65  r->mxPgno>=pPage
24560 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a  r->dbSize );  /*
24570 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66   OP_MaxPgcnt enf
24580 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  orces this */.  
24590 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
245a0 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
245b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
245c0 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
245d0 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
245e0 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
245f0 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
24600 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
24610 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
24620 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
24630 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
24640 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
24650 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
24660 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
24670 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
24680 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
24690 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
246a0 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
246b0 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
246c0 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
246d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
246e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
246f0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24700 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
24710 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
24720 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
24730 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
24740 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
24750 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
24760 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
24770 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24780 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
24790 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
247a0 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
247b0 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
247c0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
247d0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
247e0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
247f0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
24800 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
24810 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24820 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
24830 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
24840 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
24850 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
24860 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
24870 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
24880 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
24890 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
248a0 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
248b0 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
248c0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
248d0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
248e0 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
248f0 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
24900 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
24910 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
24920 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
24930 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
24940 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
24950 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
24960 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
24970 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
24980 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
24990 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
249a0 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
249b0 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
249c0 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
249d0 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
249e0 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
249f0 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
24a00 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
24a10 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
24a20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
24a30 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
24a40 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
24a50 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
24a60 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
24a70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
24a80 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
24a90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
24aa0 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
24ab0 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
24ac0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24ad0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
24ae0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
24af0 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
24b00 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
24b10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24b20 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
24b30 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
24b40 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
24b50 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
24b60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
24b70 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
24b80 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
24b90 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
24ba0 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
24bb0 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
24bc0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
24bd0 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
24be0 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
24bf0 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
24c00 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
24c10 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
24c20 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
24c30 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
24c40 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
24c50 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
24c60 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
24c70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
24c80 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
24c90 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
24ca0 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
24cb0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
24cc0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
24cd0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
24ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
24cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24d00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24d10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24d20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
24d30 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74  ed when a read-t
24d40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
24d50 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  en on.** the pag
24d60 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  er. It returns t
24d70 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
24d80 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
24d90 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
24da0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
24db0 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
24dc0 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
24dd0 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
24de0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
24df0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
24e00 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76   page file..*/.v
24e10 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
24e20 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
24e30 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
24e40 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
24e50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
24e60 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
24e70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24e80 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
24e90 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
24ea0 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
24eb0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
24ec0 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.}.../*.** T
24ed0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
24ee0 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
24ef0 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
24f00 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
24f10 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
24f20 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
24f30 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
24f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
24f50 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
24f60 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
24f70 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
24f80 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
24f90 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
24fa0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
24fb0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
24fc0 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
24fd0 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
24fe0 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
24ff0 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
25000 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
25010 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
25020 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
25030 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
25040 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
25050 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
25060 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
25070 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
25080 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
25090 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
250a0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
250b0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
250c0 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
250d0 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
250e0 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
250f0 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
25100 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
25110 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
25120 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
25130 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
25140 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
25150 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
25160 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25190 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
251a0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
251b0 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
251c0 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
251d0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
251e0 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
251f0 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f   held), or one o
25200 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  f the transition
25210 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
25220 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
25230 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
25240 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
25250 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
25260 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
25270 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
25280 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
25290 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
252a0 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ock>=locktype). 
252b0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
252c0 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
252d0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
252e0 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
252f0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
25300 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
25310 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
25320 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
25330 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20    );..  do {.   
25340 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
25350 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  b(pPager, lockty
25360 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  pe);.  }while( r
25370 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
25380 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
25390 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
253a0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
253b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
253c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
253d0 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
253e0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
253f0 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
25400 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
25410 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
25420 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
25430 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
25440 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
25450 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
25460 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
25470 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
25480 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
25490 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
254a0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
254b0 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
254c0 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
254d0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
254e0 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
254f0 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
25500 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
25510 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
25520 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
25530 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
25540 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
25550 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
25560 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
25570 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
25580 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
25590 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
255a0 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
255b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
255c0 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
255d0 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
255e0 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
255f0 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
25600 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
25610 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
25620 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
25630 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
25640 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
25650 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
25660 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
25670 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
25680 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
25690 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
256a0 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
256b0 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
256c0 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
256d0 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74  would be to rest
256e0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ore the current.
256f0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
25700 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c  e page. However,
25710 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74   since this cont
25720 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
25730 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  nt in either.** 
25740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25750 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e  e or the portion
25760 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
25770 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a   journal and .**
25780 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   sub-journal rol
25790 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e  led back the con
257a0 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tent could not b
257b0 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74  e restored and t
257c0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69  he.** database i
257d0 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d  mage would becom
257e0 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73  e corrupt. It is
257f0 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75   therefore fortu
25800 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68  nate that .** th
25810 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20  is circumstance 
25820 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f  cannot arise..*/
25830 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
25840 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
25850 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
25860 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
25870 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  b(PgHdr *pPg){. 
25880 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
25890 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
258a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75  );.  assert( !su
258b0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
258c0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
258d0 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  <=pPg->pPager->d
258e0 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69  bSize );.}.stati
258f0 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
25900 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25910 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
25920 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
25930 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
25940 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73  er->pPCache, ass
25950 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25960 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73  raintCb);.}.#els
25970 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
25980 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25990 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64  int(pPager).#end
259a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
259b0 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
259c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
259d0 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
259e0 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
259f0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
25a00 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
25a10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25a20 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
25a30 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
25a40 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
25a50 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
25a60 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
25a70 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
25a80 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
25a90 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
25aa0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
25ab0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tted..**.** This
25ac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
25ad0 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  y called right b
25ae0 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
25af0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
25b00 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e  ** Once this fun
25b10 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
25b20 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73  alled, the trans
25b30 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68  action must eith
25b40 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20  er be.** rolled 
25b50 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65  back or committe
25b60 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  d. It is not saf
25b70 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  e to call this f
25b80 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74  unction and.** t
25b90 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69  hen continue wri
25ba0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
25bb0 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
25bc0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
25bd0 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
25be0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
25bf0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
25c00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50  ager->dbSize>=nP
25c10 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
25c20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
25c30 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
25c40 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67  CHEMOD );.  pPag
25c50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
25c60 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65  ge;..  /* At one
25c70 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20   point the code 
25c80 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65  here called asse
25c90 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25ca0 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65  aint() to.  ** e
25cb0 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70  nsure that all p
25cc0 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63  ages being trunc
25cd0 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69  ated away by thi
25ce0 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c  s operation are,
25cf0 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20  .  ** if one or 
25d00 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20  more savepoints 
25d10 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e  are open, presen
25d20 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69  t in the savepoi
25d30 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  nt .  ** journal
25d40 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
25d50 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66  n be restored if
25d60 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
25d70 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61  s rolled.  ** ba
25d80 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c  ck. This is no l
25d90 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20  onger necessary 
25da0 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  as this function
25db0 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a   is now only.  *
25dc0 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  * called right b
25dd0 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
25de0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
25df0 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20  So although the 
25e00 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65  .  ** Pager obje
25e10 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76  ct may still hav
25e20 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
25e30 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  s (Pager.nSavepo
25e40 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74  int!=0), .  ** t
25e50 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  hey cannot be ro
25e60 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68  lled back. So th
25e70 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
25e80 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c  Constraint() cal
25e90 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e  l.  ** is no lon
25ea0 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a  ger correct. */.
25eb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
25ec0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
25ed0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
25ee0 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
25ef0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a  l rollback. It.*
25f00 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  * syncs the jour
25f10 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  nal file to disk
25f20 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67  , then sets pPag
25f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  er->journalHdr t
25f40 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66  o the.** size of
25f50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25f60 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
25f70 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
25f80 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20  outine knows.** 
25f90 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
25fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
25fb0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a   been synced..**
25fc0 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f  .** Syncing a ho
25fd0 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73  t-journal to dis
25fe0 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
25ff0 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ing to roll it b
26000 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20  ack ensures .** 
26010 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d  that if a power-
26020 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64  failure occurs d
26030 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
26040 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20  ck, the process 
26050 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73  that.** attempts
26060 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
26070 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76  ing system recov
26080 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d  ery sees the sam
26090 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e  e journal.** con
260a0 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f  tent as this pro
260b0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  cess..**.** If e
260c0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
260d0 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54  s planned, SQLIT
260e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
260f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
26100 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
26110 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
26120 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f   int pagerSyncHo
26130 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
26140 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
26150 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26160 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
26170 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
26180 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
26190 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
261a0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
261b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
261c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
261d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
261e0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
261f0 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  fd, &pPager->jou
26200 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20  rnalHdr);.  }.  
26210 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26220 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66  .** Obtain a ref
26230 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f  erence to a memo
26240 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f  ry mapped page o
26250 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e  bject for page n
26260 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20  umber pgno. .** 
26270 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
26280 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e  ill use the poin
26290 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69  ter pData, obtai
262a0 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28  ned from xFetch(
262b0 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  )..** If success
262c0 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65  ful, set *ppPage
262d0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
262e0 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65   new page refere
262f0 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  nce.** and retur
26300 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
26310 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
26320 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26330 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a  ode and set.** *
26340 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  ppPage to zero..
26350 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72  **.** Page refer
26360 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62  ences obtained b
26370 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  y calling this f
26380 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
26390 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79  e released.** by
263a0 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65   calling pagerRe
263b0 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a  leaseMapPage()..
263c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
263d0 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
263e0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
263f0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
26400 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
26410 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ject */.  Pgno p
26420 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
26430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26440 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f  e number */.  vo
26450 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  id *pData,      
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26470 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61   xFetch()'d data
26480 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
26490 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61  /.  PgHdr **ppPa
264a0 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ge              
264b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75      /* OUT: Acqu
264c0 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  ired page object
264d0 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
264e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
264f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
26500 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74  ry mapped page t
26510 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69  o return */..  i
26520 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  f( pPager->pMmap
26530 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
26540 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50  *ppPage = p = pP
26550 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26560 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ist;.    pPager-
26570 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
26580 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
26590 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
265a0 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78     memset(p->pEx
265b0 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  tra, 0, pPager->
265c0 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65  nExtra);.  }else
265d0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
265e0 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
265f0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
26600 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
26610 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
26620 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
26630 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
26640 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
26650 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
26660 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
26670 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
26680 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26690 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
266a0 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76    p->pExtra = (v
266b0 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  oid *)&p[1];.   
266c0 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44   p->flags = PGHD
266d0 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e  R_MMAP;.    p->n
266e0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e  Ref = 1;.    p->
266f0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
26700 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
26710 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64  p->pExtra==(void
26720 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73   *)&p[1] );.  as
26730 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d  sert( p->pPage==
26740 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26750 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d  ->flags==PGHDR_M
26760 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MAP );.  assert(
26770 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67   p->pPager==pPag
26780 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
26790 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20  p->nRef==1 );.. 
267a0 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b   p->pgno = pgno;
267b0 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44  .  p->pData = pD
267c0 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ata;.  pPager->n
267d0 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65  MmapOut++;..  re
267e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
267f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
26800 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26810 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75  page pPg. pPg mu
26820 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74  st have been ret
26830 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20  urned by an .** 
26840 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
26850 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26860 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
26870 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61   void pagerRelea
26880 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20  seMapPage(PgHdr 
26890 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
268a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
268b0 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ager;.  pPager->
268c0 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50  nMmapOut--;.  pP
268d0 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
268e0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
268f0 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  t;.  pPager->pMm
26900 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67  apFreelist = pPg
26910 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
26920 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
26930 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
26940 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ;.  sqlite3OsUnf
26950 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
26960 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f   (i64)(pPg->pgno
26970 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
26980 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61  Size, pPg->pData
26990 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
269a0 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63   all PgHdr objec
269b0 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ts stored in the
269c0 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65   Pager.pMmapFree
269d0 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  list list..*/.st
269e0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
269f0 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72  reeMapHdrs(Pager
26a00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
26a10 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a  dr *p;.  PgHdr *
26a20 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
26a30 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26a40 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74  list; p; p=pNext
26a50 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
26a60 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71  ->pDirty;.    sq
26a70 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
26a80 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75   }.}.../*.** Shu
26a90 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
26aa0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
26ab0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
26ac0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
26ad0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
26ae0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
26af0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
26b00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
26b10 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
26b20 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
26b30 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
26b40 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
26b50 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
26b60 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
26b70 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
26b80 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
26b90 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
26ba0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
26bb0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
26bc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
26bd0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
26be0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
26bf0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
26c00 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
26c10 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
26c20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
26c30 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
26c40 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
26c50 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
26c60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
26c70 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
26c80 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
26c90 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
26ca0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
26cb0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
26cc0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
26cd0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
26ce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
26cf0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
26d00 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
26d10 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
26d20 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
26d30 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
26d40 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
26d50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62  ager) );.  disab
26d60 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
26d70 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
26d80 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
26d90 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46  lloc();.  pagerF
26da0 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65  reeMapHdrs(pPage
26db0 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  r);.  /* pPager-
26dc0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f  >errCode = 0; */
26dd0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
26de0 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69  siveMode = 0;.#i
26df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26e00 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57  T_WAL.  sqlite3W
26e10 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  alClose(pPager->
26e20 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b  pWal, pPager->ck
26e30 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61  ptSyncFlags, pPa
26e40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26e50 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Tmp);.  pPager->
26e60 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pWal = 0;.#endif
26e70 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
26e80 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
26e90 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
26ea0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
26eb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26ec0 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20   If it is open, 
26ed0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
26ee0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
26ef0 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  ling UnlockAndRo
26f00 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49  llback..    ** I
26f10 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f  f this is not do
26f20 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79  ne, then an unsy
26f30 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
26f40 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
26f50 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61   .    ** file ma
26f60 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  y be played back
26f70 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
26f80 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
26f90 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20  ailure occurs . 
26fa0 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73     ** while this
26fb0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
26fc0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
26fd0 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
26fe0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
26ff0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
27000 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
27010 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  to sync the jour
27020 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70  nal, shift the p
27030 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ager.    ** into
27040 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
27050 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e  . This causes Un
27060 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20  lockAndRollback 
27070 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20  to unlock the.  
27080 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e    ** database an
27090 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  d close the jour
270a0 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74  nal file without
270b0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
270c0 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61  oll it.    ** ba
270d0 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69  ck or finalize i
270e0 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61  t. The next data
270f0 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68  base user will h
27100 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f  ave to do hot-jo
27110 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c  urnal.    ** rol
27120 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63  lback before acc
27130 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
27140 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
27150 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
27160 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
27170 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
27180 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53  r(pPager, pagerS
27190 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
271a0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
271b0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
271c0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
271d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
271e0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
271f0 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
27200 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
27210 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
27220 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
27230 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
27240 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
27250 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
27260 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  )).  sqlite3OsCl
27270 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
27280 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ;.  sqlite3OsClo
27290 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
272a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
272b0 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74  e(pTmp);.  sqlit
272c0 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
272d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
272e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
272f0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
27300 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
27310 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
27320 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
27330 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
27340 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27350 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
27360 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
27370 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
27380 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
27390 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
273a0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
273b0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
273c0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
273d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
273e0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
273f0 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
27400 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
27410 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27420 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
27430 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
27440 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
27450 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
27460 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
27470 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
27480 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
27490 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
274a0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
274b0 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
274c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
274d0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
274e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
274f0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
27500 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
27510 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
27520 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
27530 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
27540 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
27550 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
27560 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
27570 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
27580 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
27590 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
275a0 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
275b0 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
275c0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
275d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
275e0 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  er.noSync flag i
275f0 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
27600 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
27610 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
27620 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
27630 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
27640 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
27650 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ode and the .** 
27660 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
27670 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69  istics of the fi
27680 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
27690 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
276a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
276b0 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
276c0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
276d0 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
276e0 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
276f0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
27700 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
27710 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
27720 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
27730 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
27740 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
27750 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
27760 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
27770 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
27780 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
27790 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
277a0 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
277b0 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
277c0 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
277d0 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
277e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
277f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
27800 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
27810 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
27820 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
27830 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
27840 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
27850 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
27860 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
27870 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
27880 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
27890 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
278a0 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
278b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
278c0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
278d0 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
278e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
278f0 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
27900 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
27910 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
27920 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
27930 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
27940 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
27950 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
27960 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
27970 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
27980 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
27990 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
279a0 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
279b0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
279c0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
279d0 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
279e0 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
279f0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
27a00 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
27a10 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
27a20 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
27a30 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
27a40 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
27a50 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
27a60 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
27a70 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
27a80 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
27a90 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
27aa0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
27ab0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
27ac0 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
27ad0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27af0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
27b00 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
27b10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
27b20 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
27b30 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
27b40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
27b50 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
27b60 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
27b70 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
27b80 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
27b90 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
27ba0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
27bb0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
27bc0 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
27bd0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
27be0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27bf0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
27c00 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
27c10 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
27c20 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
27c30 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
27c40 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27c50 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
27c60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
27c70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
27c80 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
27c90 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
27ca0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
27cb0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
27cc0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
27cd0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
27ce0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
27cf0 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
27d00 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
27d10 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
27d20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
27d30 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
27d40 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
27d50 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
27d60 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
27d70 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
27d80 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
27d90 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
27da0 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
27db0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
27dc0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
27dd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
27de0 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
27df0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
27e00 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
27e10 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
27e20 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
27e30 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
27e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
27e50 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
27e60 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
27e70 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
27e80 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
27e90 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
27ea0 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
27eb0 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
27ec0 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
27ed0 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
27ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
27ef0 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
27f00 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
27f10 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
27f20 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
27f30 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
27f40 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
27f50 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
27f60 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
27f70 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
27f80 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
27f90 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
27fa0 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
27fb0 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
27fc0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
27fd0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
27fe0 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
27ff0 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
28000 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
28010 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
28020 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
28030 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
28040 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
28050 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
28060 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
28070 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
28080 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
28090 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
280a0 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
280b0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
280c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
280d0 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
280e0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
280f0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
28100 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
28110 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
28120 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
28130 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
28140 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
28150 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
28160 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
28170 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
28180 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28190 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
281a0 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
281b0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
281c0 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
281d0 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
281e0 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
281f0 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
28200 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
28210 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
28220 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
28230 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
28240 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
28250 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
28260 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
28270 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
28280 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
28290 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
282a0 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
282b0 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
282c0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
282d0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
282e0 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
282f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
28300 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
28310 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
28320 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
28330 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
28340 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
28350 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
28360 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
28370 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
28380 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
28390 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
283a0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
283b0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
283c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
283d0 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
283e0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
283f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28400 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
28410 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
28420 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
28430 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
28440 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
28450 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
28460 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28470 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
28480 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
28490 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
284a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
284b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
284c0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
284d0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
284e0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
284f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28500 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
28510 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
28520 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
28530 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
28540 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
28550 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
28560 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
28570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
28580 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
28590 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
285a0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
285b0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
285c0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
285d0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
285e0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
285f0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
28600 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
28610 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28620 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
28630 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
28640 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
28650 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
28660 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
28670 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
28680 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
28690 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
286a0 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
286b0 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
286c0 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
286d0 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
286e0 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
286f0 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
28700 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
28710 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
28720 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
28730 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
28740 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
28750 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
28760 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
28770 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28780 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
28790 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
287a0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
287b0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
287c0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
287d0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
287e0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
287f0 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
28800 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
28810 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
28820 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28830 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
28840 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
28850 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
28860 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28870 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28890 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
288a0 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
288b0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
288c0 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
288d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
288e0 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
288f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
28900 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
28910 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
28920 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
28930 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
28940 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28950 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28970 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
28980 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
28990 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
289a0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
289b0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
289c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
289d0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
289e0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
289f0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
28a00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28a10 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
28a20 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
28a30 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
28a40 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
28a50 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
28a60 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
28a70 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
28a80 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
28a90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28aa0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28ab0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
28ac0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28ad0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
28ae0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
28af0 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
28b00 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
28b10 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
28b20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
28b30 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
28b40 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
28b50 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
28b60 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
28b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28b90 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
28ba0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28bb0 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
28bc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
28bd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
28be0 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
28bf0 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
28c00 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
28c10 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
28c20 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
28c30 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
28c40 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
28c50 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
28c60 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
28c70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
28c80 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
28c90 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
28ca0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
28cb0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
28cc0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
28cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
28ce0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
28cf0 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
28d00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28d10 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
28d20 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
28d30 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
28d40 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
28d50 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
28d60 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
28d70 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
28d80 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
28d90 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
28da0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
28db0 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
28dc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28dd0 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
28de0 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
28df0 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
28e00 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
28e10 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
28e20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
28e30 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
28e40 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
28e50 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
28e60 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
28e70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
28e80 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
28e90 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
28ea0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
28eb0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
28ec0 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
28ed0 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
28ee0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
28ef0 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
28f00 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
28f10 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
28f20 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
28f30 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
28f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28f50 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
28f60 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
28f70 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
28f80 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
28f90 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
28fa0 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
28fb0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
28fc0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
28fd0 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
28fe0 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
28ff0 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
29000 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
29010 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
29020 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
29030 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
29040 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
29050 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
29060 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
29070 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
29080 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
29090 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
290a0 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
290b0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
290c0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
290d0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
290e0 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
290f0 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
29100 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
29110 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
29120 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
29130 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
29140 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
29150 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
29160 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
29170 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
29180 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
29190 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
291a0 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
291b0 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
291c0 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
291d0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
291e0 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
291f0 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
29200 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
29210 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
29220 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
29230 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
29240 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
29250 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
29260 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
29270 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
29280 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29290 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
292a0 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
292b0 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
292c0 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
292d0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
292e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
292f0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29300 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
29310 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
29320 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
29330 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
29340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29350 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
29360 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
29370 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
29380 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
29390 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
293a0 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
293b0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
293c0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
293d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
293e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
293f0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
29400 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29410 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
29420 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
29430 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
29440 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
29450 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
29460 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
29470 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
29480 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
29490 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
294a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
294b0 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
294c0 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
294d0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
294e0 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
294f0 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
29500 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
29510 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
29520 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
29530 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
29540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
29550 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
29560 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
29570 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
29580 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
29590 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
295a0 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
295b0 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
295c0 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
295d0 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
295e0 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
295f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
29600 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
29610 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
29620 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
29630 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70  LITE_OK .   && p
29640 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29650 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
29660 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70  .   && (pList->p
29670 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e  Dirty || pList->
29680 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48  pgno>pPager->dbH
29690 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20  intSize).  ){.  
296a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
296b0 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
296c0 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
296d0 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
296e0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
296f0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
29700 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
29710 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
29720 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
29730 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
29740 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
29750 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29760 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
29770 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
29780 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
29790 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
297a0 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
297b0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
297c0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
297d0 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
297e0 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
297f0 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
29800 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
29810 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
29820 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
29830 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
29840 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
29850 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
29860 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
29870 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
29880 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
29890 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
298a0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
298b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
298c0 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
298d0 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
298e0 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
298f0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
29900 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
29910 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
29920 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
29930 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
29940 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
29950 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
29960 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
29970 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
29980 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
29990 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
299a0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
299b0 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
299c0 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
299d0 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
29a00 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
29a10 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
29a20 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
29a30 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
29a40 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
29a50 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
29a60 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
29a70 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
29a80 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
29a90 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
29aa0 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
29ab0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
29ac0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
29ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29ae0 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
29af0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
29b00 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
29b10 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
29b20 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
29b30 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
29b40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29b50 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
29b60 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
29b70 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
29b80 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
29b90 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
29ba0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
29bb0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
29bc0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
29bd0 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
29be0 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
29bf0 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
29c00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29c10 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
29c20 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
29c30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
29c40 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
29c50 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
29c60 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
29c70 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
29c80 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
29c90 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
29ca0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
29cb0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
29cc0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
29cd0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
29ce0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
29cf0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
29d00 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
29d10 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  TE]++;..      /*
29d20 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
29d30 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
29d40 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
29d50 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
29d60 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
29d70 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
29d80 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
29d90 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
29da0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
29db0 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
29dc0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
29dd0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
29df0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29e00 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
29e10 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
29e20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
29e30 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
29e40 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
29e50 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
29e60 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
29e70 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
29e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
29e90 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
29ea0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
29eb0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
29ec0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
29ed0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
29ee0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
29ef0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
29f00 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
29f10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29f20 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
29f30 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
29f40 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
29f50 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
29f60 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
29f70 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
29f80 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
29f90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
29fa0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
29fb0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
29fc0 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
29fd0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
29fe0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
29ff0 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
2a000 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
2a010 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
2a020 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
2a030 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
2a040 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2a050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a060 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2a070 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
2a080 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2a090 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2a0a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2a0b0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
2a0c0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
2a0d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
2a0e0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
2a0f0 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
2a100 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2a110 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
2a120 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2a130 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
2a140 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
2a150 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2a170 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
2a180 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
2a190 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
2a1a0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2a1b0 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
2a1c0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
2a1d0 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
2a1e0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2a1f0 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
2a200 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
2a210 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
2a220 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
2a230 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
2a240 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
2a250 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
2a260 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
2a270 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
2a280 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
2a290 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
2a2a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2a2b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2a2c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2a2d0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2a2e0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2a2f0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
2a300 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
2a310 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
2a320 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2a330 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2a340 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2a350 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
2a360 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
2a370 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
2a380 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
2a390 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2a3a0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
2a3b0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
2a3c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a3d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2a3e0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2a3f0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2a400 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
2a410 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
2a420 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
2a430 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
2a440 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
2a450 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
2a460 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a470 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2a480 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
2a490 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2a4a0 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
2a4b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2a4c0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2a4d0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a4e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
2a4f0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2a500 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2a510 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
2a520 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
2a530 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67  rnal(pPager, pPg
2a540 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2a550 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2a560 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2a570 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
2a580 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
2a590 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
2a5a0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2a5b0 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
2a5c0 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
2a5d0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
2a5e0 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
2a5f0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
2a600 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
2a610 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2a620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a630 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2a640 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
2a650 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
2a660 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  64)pPager->nSubR
2a670 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
2a680 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
2a690 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a  har *pData2;.  .
2a6a0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2a6b0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
2a6c0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
2a6d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
2a6e0 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41  Data2);.      PA
2a6f0 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
2a700 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
2a710 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a720 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2a730 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
2a740 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2a750 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
2a760 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2a770 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2a7a0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
2a7b0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2a7c0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2a7d0 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
2a7e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2a7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
2a810 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
2a820 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2a830 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
2a840 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
2a850 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2a860 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2a870 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2a890 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2a8a0 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
2a8b0 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
2a8c0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
2a8d0 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
2a8e0 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
2a8f0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
2a900 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
2a910 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
2a920 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
2a930 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
2a940 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
2a950 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
2a960 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
2a970 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2a980 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
2a990 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
2a9a0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
2a9b0 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
2a9c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2a9d0 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
2a9e0 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
2a9f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2aa00 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
2aa10 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
2aa20 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
2aa30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
2aa40 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2aa50 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
2aa60 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
2aa70 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
2aa80 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2aa90 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
2aaa0 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
2aab0 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
2aac0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2aad0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
2aae0 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
2aaf0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2ab00 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
2ab10 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
2ab20 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2ab30 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2ab40 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2ab50 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
2ab60 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
2ab70 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
2ab80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2ab90 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
2aba0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
2abb0 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
2abc0 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
2abd0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2abe0 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2abf0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
2ac00 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
2ac10 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
2ac20 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
2ac30 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
2ac40 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
2ac50 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2ac60 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
2ac70 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
2ac80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2ac90 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2aca0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
2acb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2acc0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2acd0 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
2ace0 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43  oNotSpill NOSYNC
2acf0 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69   bit is set duri
2ad00 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2ad10 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2ad20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2ad30 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2ad40 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2ad50 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2ad60 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2ad70 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2ad80 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2ad90 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2ada0 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2adb0 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2adc0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2add0 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2ade0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f  he doNotSpill RO
2adf0 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62  LLBACK and OFF b
2ae00 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  its inhibits all
2ae10 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a   cache spilling.
2ae20 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20    ** regardless 
2ae30 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
2ae40 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
2ae50 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
2ae60 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61  et during.  ** a
2ae70 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20   rollback or by 
2ae80 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65  user request, re
2ae90 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a  spectively..  **
2aea0 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
2aeb0 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
2aec0 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
2aed0 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
2aee0 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
2aef0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
2af00 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
2af10 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
2af20 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a  lementation it .
2af30 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62    ** is impossib
2af40 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63  le for sqlite3Pc
2af50 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62  acheFetch() to b
2af60 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72  e called with cr
2af70 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a  eateFlag==3.  **
2af80 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72   while in the er
2af90 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65  ror state, hence
2afa0 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   it is impossibl
2afb0 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
2afc0 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61  ne to.  ** be ca
2afd0 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f  lled in the erro
2afe0 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74  r state.  Nevert
2aff0 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75  heless, we inclu
2b000 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a  de a NEVER().  *
2b010 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65  * test for the e
2b020 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20  rror state as a 
2b030 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73  safeguard agains
2b040 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
2b050 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2b060 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2b070 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  de) ) return SQL
2b080 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61  ITE_OK;.  testca
2b090 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2b0a0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2b0b0 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  AG_ROLLBACK );. 
2b0c0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2b0d0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2b0e0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b  SPILLFLAG_OFF );
2b0f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2b100 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2b110 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59  & SPILLFLAG_NOSY
2b120 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  NC );.  if( pPag
2b130 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20  er->doNotSpill. 
2b140 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64    && ((pPager->d
2b150 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49  oNotSpill & (SPI
2b160 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c  LLFLAG_ROLLBACK|
2b170 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21  SPILLFLAG_OFF))!
2b180 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  =0.      || (pPg
2b190 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
2b1a0 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20  NEED_SYNC)!=0). 
2b1b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b1c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2b1d0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
2b1e0 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
2b1f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
2b200 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
2b210 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
2b220 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
2b230 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  log. */.    if( 
2b240 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2b250 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20  (pPg) ){ .      
2b260 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2b270 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d  age(pPg); .    }
2b280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b2a0 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
2b2b0 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
2b2c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2b2d0 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
2b2e0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2b2f0 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72  l file if requir
2b300 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2b310 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2b320 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20  NEED_SYNC .     
2b330 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2b340 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2b350 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a  CACHEMOD.    ){.
2b360 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
2b370 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31  ournal(pPager, 1
2b380 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
2b390 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
2b3a0 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61  umber of this pa
2b3b0 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ge is larger tha
2b3c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  n the current si
2b3d0 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ze of.    ** the
2b3e0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
2b3f0 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
2b400 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2b410 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
2b420 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
2b430 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  cause the call t
2b440 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  o pager_write_pa
2b450 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77  gelist() below w
2b460 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61  ill not.    ** a
2b470 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61  ctually write da
2b480 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69  ta to the file i
2b490 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
2b4a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69   **.    ** Consi
2b4b0 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
2b4c0 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
2b4d0 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ents:.    **.   
2b4e0 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   **   BEGIN;.   
2b4f0 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
2b500 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
2b510 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
2b520 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   X>.    **     S
2b530 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20  AVEPOINT sp;.   
2b540 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e   **       <shrin
2b550 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
2b560 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20  to Y pages>.    
2b570 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74  **       pagerSt
2b580 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20  ress(page X).   
2b590 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
2b5a0 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20   TO sp;.    **. 
2b5b0 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20     ** If (X>Y), 
2b5c0 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53  then when pagerS
2b5d0 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20  tress is called 
2b5e0 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20  page X will not 
2b5f0 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  be written.    *
2b600 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2b610 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20  abase file, but 
2b620 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20  will be dropped 
2b630 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20  from the cache. 
2b640 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c  Then,.    ** fol
2b650 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
2b660 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
2b670 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
2b680 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
2b690 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d      ** data from
2b6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b6b0 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65  le. This will be
2b6c0 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67   the copy of pag
2b6d0 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a  e X as it.    **
2b6e0 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72   was when the tr
2b6f0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
2b700 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73  d, not as it was
2b710 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54   when "SAVEPOINT
2b720 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20   sp".    ** was 
2b730 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a  executed..    **
2b740 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
2b750 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
2b760 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
2b770 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
2b780 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
2b790 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  b-journal file n
2b7a0 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ow (if it is not
2b7b0 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c   already there),
2b7c0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
2b7d0 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f  .    ** be resto
2b7e0 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65  red to its curre
2b7f0 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  nt value when th
2b800 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
2b810 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78  p" is .    ** ex
2b820 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ecuted..    */. 
2b830 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20     if( NEVER(.  
2b840 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
2b850 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
2b860 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
2b870 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
2b880 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29  age(pPg).    ) )
2b890 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
2b8a0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2b8b0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2b8c0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
2b8d0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2b8e0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2b8f0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2b900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2b920 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
2b930 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2b940 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
2b950 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2b960 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
2b970 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2b980 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
2b990 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
2b9a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b9b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
2b9c0 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
2b9d0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2b9e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2b9f0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2ba00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2ba10 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
2ba20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
2ba30 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2ba40 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rc); .}.../*.** 
2ba50 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2ba60 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
2ba70 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
2ba80 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
2ba90 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
2baa0 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
2bab0 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
2bac0 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
2bad0 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
2bae0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
2baf0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
2bb00 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
2bb10 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
2bb20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2bb30 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
2bb40 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
2bb50 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
2bb60 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
2bb70 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
2bb80 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
2bb90 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
2bba0 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
2bbb0 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
2bbc0 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
2bbd0 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
2bbe0 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
2bbf0 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
2bc00 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
2bc10 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2bc20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
2bc30 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
2bc40 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
2bc50 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
2bc60 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
2bc70 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2bc80 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
2bc90 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
2bca0 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
2bcb0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2bcc0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
2bcd0 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
2bce0 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
2bcf0 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
2bd00 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
2bd10 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
2bd20 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
2bd30 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
2bd40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
2bd50 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2bd60 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2bd70 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2bd80 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2bd90 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2bda0 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2bdb0 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2bdc0 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2bdd0 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2bde0 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2bdf0 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2be00 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2be10 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2be20 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2be30 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2be40 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2be50 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2be60 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2be70 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2be80 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2be90 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2bea0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2beb0 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2bec0 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2bed0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2bee0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2bef0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2bf00 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2bf10 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2bf20 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2bf30 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2bf40 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2bf50 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2bf60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2bf70 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2bf80 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2bf90 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2bfa0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2bfb0 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2bfc0 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2bfd0 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2bfe0 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2bff0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2c000 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2c010 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2c020 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2c030 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2c040 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2c050 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2c060 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2c070 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2c080 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2c090 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2c0a0 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2c0b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c0c0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2c0d0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2c0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2c0f0 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2c100 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2c110 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2c120 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c130 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2c140 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2c150 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2c160 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c170 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2c180 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2c190 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2c1a0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2c1b0 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2c1c0 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2c1d0 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2c1e0 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2c1f0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2c200 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2c210 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2c220 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2c230 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2c240 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2c250 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2c260 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2c270 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2c280 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2c290 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2c2a0 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2c2b0 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2c2c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2c2d0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2c2e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2c2f0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2c300 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2c310 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c320 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2c330 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2c340 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2c350 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2c360 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2c370 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2c380 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2c390 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2c3a0 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2c3b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2c3c0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2c3d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c3e0 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2c3f0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2c400 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2c410 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2c420 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2c430 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2c440 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2c450 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2c460 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2c470 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2c480 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2c490 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2c4a0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2c4b0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2c4c0 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2c4d0 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2c4e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2c4f0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2c500 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2c510 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2c520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c530 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2c540 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2c550 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2c560 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2c570 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2c580 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2c590 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2c5a0 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2c5b0 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2c5c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2c5d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2c5e0 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20  ). This.  ** is 
2c5f0 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
2c600 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
2c610 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
2c620 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2c630 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75  .  ** and a regu
2c640 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2c650 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68  -handle. Note th
2c660 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f  at a "regular jo
2c670 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20  urnal-handle".  
2c680 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70  ** may be a wrap
2c690 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63  per capable of c
2c6a0 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74  aching the first
2c6b0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
2c6c0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
2c6d0 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69  e in memory to i
2c6e0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f  mplement the ato
2c6f0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2c700 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a  zation (see .  *
2c710 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f  * source file jo
2c720 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20  urnal.c)..  */. 
2c730 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
2c740 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71  nalSize(pVfs)>sq
2c750 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2c760 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75  ize() ){.    jou
2c770 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2c780 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75  OUND8(sqlite3Jou
2c790 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b  rnalSize(pVfs));
2c7a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f  .  }else{.    jo
2c7b0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2c7c0 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65  ROUND8(sqlite3Me
2c7d0 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b  mJournalSize());
2c7e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2c7f0 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2c800 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2c810 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2c820 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2c830 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2c840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2c850 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2c860 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2c870 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2c880 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2c890 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2c8a0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2c8b0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c8c0 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2c8d0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2c8e0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2c8f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c900 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61  NOMEM;.      nPa
2c910 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c920 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2c930 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65  me);.      zFile
2c940 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  name = 0;.    }.
2c950 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2c960 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2c970 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2c980 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2c990 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2c9a0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2c9b0 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2c9c0 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2c9d0 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2c9e0 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2c9f0 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2ca00 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2ca10 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2ca20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2ca30 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2ca40 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  [0] ){.    const
2ca50 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50   char *z;.    nP
2ca60 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
2ca70 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
2ca80 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2ca90 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2caa0 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29  (0, nPathname*2)
2cab0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
2cac0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2cad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2cae0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  MEM;.    }.    z
2caf0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
2cb00 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
2cb10 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
2cb20 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
2cb30 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63   fails */.    rc
2cb40 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
2cb50 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2cb60 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
2cb70 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
2cb80 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2cb90 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2cba0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2cbb0 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69   z = zUri = &zFi
2cbc0 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  lename[sqlite3St
2cbd0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
2cbe0 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
2cbf0 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b   *z ){.      z +
2cc00 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2cc10 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20  0(z)+1;.      z 
2cc20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2cc30 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20  30(z)+1;.    }. 
2cc40 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28     nUri = (int)(
2cc50 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20  &z[1] - zUri);. 
2cc60 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e     assert( nUri>
2cc70 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
2cc80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2cc90 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2cca0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2ccb0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2ccc0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2ccd0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2cce0 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2ccf0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2cd00 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2cd10 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2cd20 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2cd30 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2cd40 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2cd50 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2cd60 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2cd70 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2cd80 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2cd90 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2cda0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2cdb0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2cdc0 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2cdd0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2cde0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2cdf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2ce00 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2ce10 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2ce20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ce30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2ce40 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2ce50 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2ce60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ce70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
2ce80 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
2ce90 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2cea0 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65  ure, PCache obje
2ceb0 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72  ct, the.  ** thr
2cec0 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ee file descript
2ced0 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ors, the databas
2cee0 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  e file name and 
2cef0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
2cf00 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65  * file name. The
2cf10 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72   layout in memor
2cf20 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  y is as follows:
2cf30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50  .  **.  **     P
2cf40 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20  ager object     
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2cf60 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79  sizeof(Pager) by
2cf70 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43  tes).  **     PC
2cf80 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20  ache object     
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2cfa0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2cfb0 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  () bytes).  **  
2cfc0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2cfd0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2cfe0 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69     (pVfs->szOsFi
2cff0 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  le bytes).  **  
2d000 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66     Sub-journal f
2d010 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d020 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2d030 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2d040 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c      Main journal
2d050 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2d060 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2d070 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2d080 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2d090 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2d0a0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2d0b0 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  1 bytes).  **   
2d0c0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e    Journal file n
2d0d0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2d0e0 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31    (nPathname+8+1
2d0f0 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70   bytes).  */.  p
2d100 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  Ptr = (u8 *)sqli
2d110 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
2d120 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
2d130 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20  (*pPager)) +    
2d140 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
2d150 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ture */.    ROUN
2d160 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b  D8(pcacheSize) +
2d170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43             /* PC
2d180 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
2d190 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e     ROUND8(pVfs->
2d1a0 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20  szOsFile) +     
2d1b0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62    /* The main db
2d1c0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75   file */.    jou
2d1d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32  rnalFileSize * 2
2d1e0 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   +          /* T
2d1f0 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
2d200 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
2d210 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2d220 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  i +         /* z
2d230 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Filename */.    
2d240 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20  nPathname + 8 + 
2d250 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2              /
2d260 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  * zJournal */.#i
2d270 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d280 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74  T_WAL.    + nPat
2d290 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20  hname + 4 + 2   
2d2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2d2b0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2d2c0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2d2d0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2d2e0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2d2f0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2d300 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2d310 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2d320 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2d330 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2d340 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2d350 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2d360 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2d370 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2d380 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2d390 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2d3a0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2d3b0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2d3c0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2d3d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d3e0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2d3f0 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2d400 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2d410 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d420 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2d430 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2d440 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2d450 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d460 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2d470 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2d480 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2d490 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2d4a0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2d4b0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2d4c0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d4d0 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2d4e0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2d4f0 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2d500 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2d510 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2d520 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2d530 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2d540 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d550 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2d560 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2d570 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2d580 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2d590 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2d5a0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2d5b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2d5c0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d5d0 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  e);.    if( nUri
2d5e0 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65   ) memcpy(&pPage
2d5f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
2d600 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c  thname+1], zUri,
2d610 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2d620 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
2d630 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
2d640 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d650 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2d660 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d670 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30  me], "-journal\0
2d680 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73  00", 8+2);.    s
2d690 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2d6a0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2d6b0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ame, pPager->zJo
2d6c0 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20  urnal);.#ifndef 
2d6d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2d6e0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c      pPager->zWal
2d6f0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   = &pPager->zJou
2d700 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38  rnal[nPathname+8
2d710 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1];.    memcpy(
2d720 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
2d730 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d740 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2d750 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2d760 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c  athname], "-wal\
2d770 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20  000", 4+1);.    
2d780 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2d790 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2d7a0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57  name, pPager->zW
2d7b0 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  al);.#endif.    
2d7c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d7d0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d   zPathname);.  }
2d7e0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
2d7f0 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
2d800 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
2d810 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
2d820 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
2d830 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2d840 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2d850 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
2d860 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
2d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d880 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
2d890 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
2d8a0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2d8b0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2d8c0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d8d0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
2d8e0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
2d8f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65  .    assert( !me
2d900 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f  mDb );.    readO
2d910 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2d920 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2d930 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2d940 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2d950 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2d960 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2d970 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2d980 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2d990 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2d9a0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2d9b0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2d9c0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2d9d0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2d9e0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2d9f0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2da00 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2da10 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2da20 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2da30 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2da40 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2da50 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2da60 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2da70 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2da80 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2da90 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2daa0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2dab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dac0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2dad0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2dae0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2daf0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2db00 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2db10 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2db20 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2db30 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2db40 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2db50 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2db60 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2db70 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2db80 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2db90 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2dba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2dbb0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2dbc0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2dbd0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dbf0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2dc00 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2dc10 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2dc20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2dc30 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2dc40 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2dc50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2dc60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc70 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2dc80 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2dc90 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2dca0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2dcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2dcc0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2dcd0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2dce0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2dcf0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2dd00 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2dd10 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2dd20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2dd30 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2dd40 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2dd50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2dd60 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2dd70 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2dd80 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dd90 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2dda0 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2ddb0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2ddc0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2ddd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2dde0 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2de00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2de20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2de30 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2de40 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2de50 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2de60 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2de70 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2de80 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2de90 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2dea0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2deb0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2dec0 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2ded0 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2dee0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2def0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2df00 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2df10 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2df20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2df30 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2df40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2df50 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2df60 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2df70 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2df80 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2df90 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2dfa0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2dfb0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2dfc0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2dfd0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2dfe0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2dff0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2e000 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2e010 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2e020 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2e030 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2e040 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2e050 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2e060 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2e070 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2e080 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2e090 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2e0a0 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2e0b0 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2e0c0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2e0d0 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2e0e0 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2e0f0 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2e100 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2e110 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2e120 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2e130 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2e140 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2e150 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2e160 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2e170 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2e180 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2e190 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2e1a0 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2e1b0 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2e1c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
2e1d0 6e 67 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70  ng mode */.    p
2e1e0 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20  Pager->noLock = 
2e1f0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2e200 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69    /* Do no locki
2e210 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e  ng */.    readOn
2e220 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
2e230 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2e240 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
2e250 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
2e260 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
2e270 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
2e280 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
2e290 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
2e2a0 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
2e2b0 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
2e2c0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
2e2d0 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
2e2e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e2f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e300 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
2e310 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e320 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
2e330 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
2e340 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
2e350 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
2e360 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
2e370 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e380 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2e390 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  t. */.  if( rc==
2e3a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e3b0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
2e3c0 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74  1000 );.    nExt
2e3d0 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
2e3e0 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ra);.    rc = sq
2e3f0 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
2e400 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
2e410 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
2e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e430 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
2e440 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
2e450 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
2e460 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2e470 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
2e480 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62  rror occurred ab
2e490 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50  ove, free the  P
2e4a0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2e4b0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2e4c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2e4d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e4e0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2e4f0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2e500 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
2e510 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
2e520 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  pace);.    sqlit
2e530 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
2e540 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2e550 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2e560 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
2e570 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
2e580 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
2e590 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2e5a0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
2e5b0 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
2e5c0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
2e5d0 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
2e5e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
2e5f0 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
2e600 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e610 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
2e620 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e630 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
2e640 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
2e650 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e660 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
2e670 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e680 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
2e690 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e6a0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
2e6b0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
2e6c0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
2e6d0 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
2e6e0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2e6f0 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
2e700 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2e710 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2e720 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2e730 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2e740 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2e750 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2e760 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2e770 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2e780 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2e790 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2e7a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2e7b0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2e7c0 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2e7d0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2e7e0 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2e7f0 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2e800 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2e810 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2e820 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2e830 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2e840 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2e850 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2e860 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2e870 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2e880 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2e890 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2e8a0 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2e8b0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2e8c0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61  ->fullSync = pPa
2e8d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31  ger->noSync ?0:1
2e8e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
2e8f0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
2e900 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53 51 4c  noSync ? 0 : SQL
2e910 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2e920 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  .  pPager->ckptS
2e930 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
2e940 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
2e950 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2e960 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
2e970 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
2e980 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2e990 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2e9a0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2e9b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e9c0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2e9d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e9e0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2e9f0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2ea00 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2ea10 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2ea20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2ea30 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2ea40 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
2ea50 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2ea60 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2ea70 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53  C_NORMAL | WAL_S
2ea80 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
2ea90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
2eaa0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
2eab0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2eac0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2ead0 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
2eae0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2eaf0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
2eb00 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2eb10 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
2eb20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
2eb30 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
2eb40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2eb50 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
2eb60 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
2eb70 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
2eb80 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2eb90 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
2eba0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
2ebb0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2ebc0 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
2ebd0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
2ebe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2ebf0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2ec00 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
2ec10 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
2ec20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2ec30 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2ec40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2ec50 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
2ec60 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
2ec70 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ec80 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
2ec90 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
2eca0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
2ecb0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
2ecc0 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2ecd0 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2ece0 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2ecf0 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  ); */.  /* pPage
2ed00 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49  r->szMmap = SQLI
2ed10 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
2ed20 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20  SIZE // will be 
2ed30 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a  set by btree.c *
2ed40 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
2ed50 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2ed60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2ed70 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
2ed80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ed90 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
2eda0 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
2edb0 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
2edc0 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
2edd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2ede0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2edf0 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f   still were it o
2ee00 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e  ught.** to be on
2ee10 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e   disk.  Return n
2ee20 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f  on-zero (SQLITE_
2ee30 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2ee40 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
2ee50 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f  rror.** code fro
2ee60 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  m sqlite3OsAcces
2ee70 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61  s()) if the data
2ee80 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69  base has gone mi
2ee90 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
2eea0 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55   int databaseIsU
2eeb0 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50  nmoved(Pager *pP
2eec0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61  ager){.  int bHa
2eed0 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e  sMoved = 0;.  in
2eee0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
2eef0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20  ger->tempFile ) 
2ef00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ef10 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2ef20 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75  dbSize==0 ) retu
2ef30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ef40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ef50 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61  zFilename && pPa
2ef60 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
2ef70 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ] );.  rc = sqli
2ef80 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
2ef90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
2efa0 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
2efb0 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29  VED, &bHasMoved)
2efc0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2efd0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
2efe0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53     /* If the HAS
2eff0 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74  _MOVED file-cont
2f000 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65  rol is unimpleme
2f010 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  nted, assume tha
2f020 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  t the file.    *
2f030 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  * has not been m
2f040 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74  oved.  That is t
2f050 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65  he historical be
2f060 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65  havior of SQLite
2f070 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a  : prior to.    *
2f080 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c  * version 3.8.3,
2f090 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65   it never checke
2f0a0 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  d */.    rc = SQ
2f0b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2f0c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f0d0 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20  OK && bHasMoved 
2f0e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2f0f0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
2f100 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VED;.  }.  retur
2f110 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2f120 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2f130 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
2f140 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
2f150 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
2f160 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
2f170 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
2f180 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
2f190 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
2f1a0 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
2f1b0 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2f1c0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
2f1d0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
2f1e0 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
2f1f0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
2f200 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
2f210 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2f220 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
2f230 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
2f240 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2f250 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
2f260 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
2f270 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f280 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
2f290 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
2f2a0 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
2f2b0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
2f2c0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
2f2d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f2e0 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
2f2f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f300 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
2f310 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
2f320 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
2f330 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
2f340 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
2f350 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2f360 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
2f370 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
2f380 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
2f390 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2f3a0 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
2f3b0 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
2f3c0 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
2f3d0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
2f3e0 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
2f3f0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
2f400 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
2f410 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
2f420 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
2f430 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
2f440 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
2f450 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
2f460 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
2f470 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
2f480 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2f490 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2f4a0 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
2f4b0 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
2f4c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
2f4d0 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
2f4e0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
2f4f0 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
2f500 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
2f510 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
2f520 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
2f530 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f540 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2f550 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
2f560 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
2f570 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
2f580 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
2f590 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
2f5a0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
2f5b0 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
2f5c0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
2f5d0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2f5e0 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
2f5f0 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
2f600 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
2f610 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f620 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
2f630 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
2f640 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
2f650 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2f660 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
2f670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f680 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
2f690 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
2f6a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
2f6b0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2f6c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2f6d0 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
2f6e0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
2f6f0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
2f700 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
2f710 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
2f720 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
2f730 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2f740 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
2f750 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
2f760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2f770 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
2f780 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
2f790 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
2f7a0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
2f7b0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
2f7c0 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
2f7d0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2f7e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2f7f0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73  de */.  int exis
2f800 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ts = 1;         
2f810 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f820 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
2f830 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
2f840 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21  int jrnlOpen = !
2f850 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2f860 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  jfd);..  assert(
2f870 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2f880 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
2f890 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2f8a0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
2f8b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2f8c0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a  =PAGER_OPEN );..
2f8d0 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70    assert( jrnlOp
2f8e0 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74  en==0 || ( sqlit
2f8f0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2f900 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2f910 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c  ->jfd) &.    SQL
2f920 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
2f930 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a  TABLE_WHEN_OPEN.
2f940 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74    ));..  *pExist
2f950 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72  s = 0;.  if( !jr
2f960 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  nlOpen ){.    rc
2f970 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
2f980 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
2f990 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2f9a0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2f9b0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20   &exists);.  }. 
2f9c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f9d0 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
2f9e0 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d      int locked =
2f9f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2fa00 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
2fa10 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2fa20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
2fa30 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
2fa40 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
2fa50 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
2fa60 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
2fa70 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
2fa80 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
2fa90 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
2faa0 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
2fab0 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
2fac0 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
2fad0 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
2fae0 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
2faf0 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
2fb00 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
2fb10 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
2fb20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
2fb30 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2fb40 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
2fb50 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
2fb60 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
2fb70 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2fb80 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
2fb90 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
2fba0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
2fbb0 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
2fbc0 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
2fbd0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2fbe0 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
2fbf0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
2fc00 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
2fc10 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
2fc20 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
2fc30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2fc40 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2fc50 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
2fc60 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
2fc70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fc80 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
2fc90 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
2fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2fcc0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
2fcd0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72  file */..      r
2fce0 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2fcf0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2fd00 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2fd10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fd20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2fd30 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65 72   database is zer
2fd40 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c  o pages in size,
2fd50 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
2fd60 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65 0a   either (1) the.
2fd70 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
2fd80 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20  al is a remnant 
2fd90 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74  from a prior dat
2fda0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2fdb0 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20  ame name where. 
2fdc0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
2fdd0 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74 20  tabase file but 
2fde0 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
2fdf0 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20  was deleted, or 
2fe00 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  (2) the initial.
2fe10 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
2fe20 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75  action that popu
2fe30 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61  lates a new data
2fe40 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f  base is being ro
2fe50 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20  lled back..     
2fe60 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20     ** In either 
2fe70 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  case, the journa
2fe80 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65  l file can be de
2fe90 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c  leted.  However,
2fea0 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20   take care.     
2feb0 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c     ** not to del
2fec0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2fed0 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c  file if it is al
2fee0 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74  ready open due t
2fef0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  o.        ** jou
2ff00 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
2ff10 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  T..        */.  
2ff20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
2ff30 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20  =0 && !jrnlOpen 
2ff40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2ff50 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
2ff60 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2ff70 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b     if( pagerLock
2ff80 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
2ff90 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
2ffa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ffb0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
2ffc0 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
2ffd0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
2ffe0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2fff0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
30000 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e  veMode ) pagerUn
30010 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
30020 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
30030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30040 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
30050 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
30060 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
30080 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
30090 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
300a0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
300b0 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
300c0 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
300d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
300e0 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
300f0 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
30100 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
30110 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
30120 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
30130 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
30140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
30150 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
30160 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
30170 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
30180 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
30190 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
301a0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
301b0 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
301c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
301d0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
301e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
301f0 74 20 66 20 3d 20 0a 23 69 66 20 53 51 4c 49 54  t f = .#if SQLIT
30200 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
30210 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
30220 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
30230 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
30240 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
30250 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
30260 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f.              
30270 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
30280 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
30290 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
302a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
302b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
302c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
302d0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
302e0 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
302f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30310 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30320 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
30330 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30340 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
30350 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
30360 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
30370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
30390 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
303a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
303b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
303c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
303d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
303e0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
303f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30400 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
30410 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
30420 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30430 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
30440 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
30450 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
30460 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
30470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
30480 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
30490 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
304a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
304b0 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
304c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
304d0 74 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  t has a zero hea
304e0 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
304f0 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
30500 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
30510 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
30520 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
30530 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
30540 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
30550 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
30560 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
30570 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
30580 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
30590 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
305a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
305b0 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
305c0 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
305d0 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
305e0 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
305f0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
30600 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
30610 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
30620 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
30630 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
30640 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
30650 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
30660 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
30670 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
30680 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
30690 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
306a0 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
306b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
306c0 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
306d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
306e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
306f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30710 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
30720 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30730 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30740 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
30750 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
30760 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30770 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
30780 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
30790 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
307a0 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
307b0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
307c0 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
307d0 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
307e0 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
307f0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
30800 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
30810 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30820 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
30830 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
30840 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
30850 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
30860 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
30870 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
30880 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
30890 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
308a0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
308b0 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
308c0 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
308d0 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
308e0 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
308f0 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
30900 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
30910 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30920 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
30930 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
30940 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
30950 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
30960 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
30970 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
30980 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
30990 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
309a0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
309b0 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
309c0 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
309d0 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
309e0 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
309f0 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
30a00 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
30a10 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
30a20 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
30a30 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
30a40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
30a50 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
30a60 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
30a70 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
30a80 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
30a90 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
30aa0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
30ab0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
30ac0 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
30ad0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
30ae0 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
30af0 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
30b00 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
30b10 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
30b20 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
30b30 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
30b40 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
30b50 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
30b60 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
30b70 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
30b80 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
30b90 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
30ba0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
30bb0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
30bc0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
30bd0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
30be0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
30bf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
30c00 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
30c10 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
30c20 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
30c30 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
30c40 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
30c50 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
30c60 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
30c70 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
30c80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
30c90 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
30ca0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
30cb0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
30cc0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
30cd0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30cf0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
30d00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
30d10 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
30d20 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
30d30 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
30d40 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
30d50 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
30d60 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
30d70 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
30d80 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
30d90 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
30da0 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
30db0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
30dc0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
30dd0 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
30de0 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
30df0 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
30e00 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
30e10 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
30e20 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
30e30 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
30e40 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
30e50 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
30e60 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30e70 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
30e80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30e90 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
30ea0 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44    if( NEVER(MEMD
30eb0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  B && pPager->err
30ec0 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20  Code) ){ return 
30ed0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
30ee0 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72   }..  if( !pager
30ef0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
30f00 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
30f10 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  ==PAGER_OPEN ){.
30f20 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72      int bHotJour
30f30 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20  nal = 1;        
30f40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
30f50 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20  re exists a hot 
30f60 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a  journal-file */.
30f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
30f80 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  MDB );..    rc =
30f90 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
30fa0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
30fb0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
30fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30fd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30fe0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
30ff0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  NO_LOCK || pPage
31000 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
31010 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
31020 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31030 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
31040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
31050 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
31060 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
31070 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
31080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
31090 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
310a0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
310b0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
310c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
310d0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
310e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
310f0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
31100 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
31110 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
31120 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
31130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31140 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31160 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
31170 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
31180 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
31190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
311a0 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
311b0 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CK;.        goto
311c0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
311d0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  ..      /* Get a
311e0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
311f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31200 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
31210 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
31220 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
31230 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
31240 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
31250 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
31260 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
31270 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
31280 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
31290 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
312a0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
312b0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
312c0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
312d0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
312e0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
312f0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
31300 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
31310 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
31320 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
31330 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
31340 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
31350 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
31360 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
31370 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
31380 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
31390 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
313a0 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
313b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
313c0 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
313d0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
313e0 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
313f0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
31400 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
31410 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
31420 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
31430 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
31440 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
31450 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
31460 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
31470 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
31480 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  s in locking_mod
31490 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
314a0 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20  , the lock is.  
314b0 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65      ** downgrade
314c0 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b  d to SHARED_LOCK
314d0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
314e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20  ction returns.. 
314f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
31500 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
31510 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
31520 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
31530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31540 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
31550 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
31560 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74   .      /* If it
31570 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31580 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c  open and the fil
31590 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  e exists on disk
315a0 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20  , open the .    
315b0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72    ** journal for
315c0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
315d0 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73  ss. Write access
315e0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
315f0 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  ause .      ** i
31600 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
31610 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
31620 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
31630 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20   be kept open . 
31640 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73       ** and poss
31650 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
31660 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
31670 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74  r on. Also, writ
31680 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20  e-access .      
31690 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65  ** is usually re
316a0 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69  quired to finali
316b0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ze the journal i
316c0 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  n journal_mode=p
316d0 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  ersist .      **
316e0 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20   mode (and also 
316f0 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  for journal_mode
31700 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d  =truncate on som
31710 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20  e systems)..    
31720 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
31730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
31740 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
31750 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
31760 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a  at some .      *
31770 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
31780 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
31790 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
317a0 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
317b0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
317c0 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
317d0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
317e0 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
317f0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d   .      ** may m
31800 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
31810 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
31820 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
31830 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
31840 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
31850 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
31860 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
31870 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
31880 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
31890 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
318a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
318b0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
318c0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
318d0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45  ;.        int bE
318e0 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
318f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
31900 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
31910 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ts */.        rc
31920 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
31930 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss(.            
31940 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
31950 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
31960 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62  CCESS_EXISTS, &b
31970 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20  Exists);.       
31980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31990 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
319a0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
319b0 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
319c0 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20     int f = .#if 
319d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
319e0 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
319f0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
31a00 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
31a10 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
31a20 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65  ECTION_MASK)|.#e
31a30 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
31a40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
31a50 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
31a60 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
31a70 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31a80 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
31a90 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
31aa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31ab0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
31ac0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
31ad0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
31ae0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
31af0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
31b00 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
31b10 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
31b20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
31b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
31b40 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
31b50 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
31b60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31b70 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
31b80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
31b90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
31ba0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
31bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31bc0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
31bd0 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
31be0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
31bf0 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
31c00 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
31c10 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
31c20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
31c30 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
31c40 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
31c50 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
31c60 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
31c70 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
31c80 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
31c90 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
31ca0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
31cb0 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
31cc0 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
31cd0 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
31ce0 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
31cf0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
31d00 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
31d10 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
31d20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
31d30 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
31d40 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
31d50 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
31d60 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
31d70 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
31d80 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
31d90 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
31da0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
31db0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
31dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
31dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
31de0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31df0 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
31e00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
31e10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31e20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
31e30 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
31e40 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
31e50 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
31e60 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
31e70 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
31e80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31e90 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
31ea0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
31eb0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
31ec0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
31ed0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
31ee0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31f00 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
31f10 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
31f20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
31f30 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
31f40 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
31f50 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
31f60 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
31f70 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
31f80 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
31f90 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
31fa0 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
31fb0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
31fc0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
31fd0 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
31fe0 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
31ff0 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
32000 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
32010 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
32020 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
32030 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
32040 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
32050 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
32060 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
32070 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
32080 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
32090 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
320a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
320b0 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
320c0 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
320d0 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
320e0 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
320f0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
32100 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
32110 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
32120 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
32130 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
32140 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
32150 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
32160 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
32170 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
32180 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
32190 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
321a0 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
321b0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
321c0 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
321d0 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
321e0 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
321f0 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
32200 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
32210 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
32220 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
32230 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
32240 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
32250 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
32260 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
32270 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
32280 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
32290 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
322a0 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
322b0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
322c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
322d0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
322e0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
322f0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
32300 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32320 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32330 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
32340 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
32350 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
32360 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
32370 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
32380 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
32390 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
323a0 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
323b0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
323c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
323d0 26 20 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  & (.        pPag
323e0 65 72 2d 3e 70 42 61 63 6b 75 70 20 0a 20 20 20  er->pBackup .   
323f0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63    || sqlite3Pcac
32400 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
32410 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a  er->pPCache)>0 .
32420 20 20 20 20 20 7c 7c 20 55 53 45 46 45 54 43 48       || USEFETCH
32430 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 29 7b  (pPager).    )){
32440 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
32450 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
32460 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
32470 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32480 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
32490 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
324a0 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
324b0 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
324c0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
324d0 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
324e0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
324f0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
32500 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
32510 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
32520 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
32530 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
32540 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
32550 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
32560 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32570 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
32580 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
32590 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
325a0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
325b0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
325c0 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
325d0 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
325e0 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
325f0 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
32600 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
32610 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
32620 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
32630 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
32640 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
32650 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
32660 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
32670 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
32680 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
32690 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
326a0 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
326b0 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
326c0 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
326d0 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
326e0 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
326f0 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
32700 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
32710 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
32720 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
32730 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
32740 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
32750 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32760 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a  Pgno nPage = 0;.
32770 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
32780 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
32790 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
327a0 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ];..      rc = p
327b0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
327c0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
327d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
327e0 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20  to failed;..    
327f0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
32800 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
32810 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
32820 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
32830 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
32840 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
32850 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
32860 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
32870 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
32880 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
32890 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
328a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
328b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
328c0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
328d0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
328e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
328f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32900 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
32910 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
32920 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
32930 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
32940 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
32950 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
32960 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
32970 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
32980 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
32990 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
329a0 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74        /* Unmap t
329b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
329c0 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
329d0 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70   that external p
329e0 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20  rocesses.       
329f0 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75   ** may have tru
32a00 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62  ncated the datab
32a10 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
32a20 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61  n extended it ba
32a30 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ck.        ** to
32a40 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
32a50 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ze while this pr
32a60 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f  ocess was not ho
32a70 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20  lding a lock..  
32a80 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
32a90 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20   case there may 
32aa0 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d  exist a Pager.pM
32ab0 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ap mapping that 
32ac0 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20  appears.        
32ad0 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67  ** to be the rig
32ae0 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e  ht size but is n
32af0 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69  ot actually vali
32b00 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20  d. Avoid this.  
32b10 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69        ** possibi
32b20 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e  lity by unmappin
32b30 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a  g the db here. *
32b40 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53  /.        if( US
32b50 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
32b60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
32b70 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
32b80 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
32b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32ba0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
32bb0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41  If there is a WA
32bc0 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  L file in the fi
32bd0 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20  le-system, open 
32be0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e  this database in
32bf0 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65   WAL.    ** mode
32c00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
32c10 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
32c20 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  ion call is a no
32c30 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  -op..    */.    
32c40 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61  rc = pagerOpenWa
32c50 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65  lIfPresent(pPage
32c60 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
32c70 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
32c80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32c90 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  pWal==0 || rc==S
32ca0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64  QLITE_OK );.#end
32cb0 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  if.  }..  if( pa
32cc0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32cd0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
32ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32cf0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
32d00 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
32d10 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
32d20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
32d30 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32d40 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PEN && rc==SQLIT
32d50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
32d60 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
32d70 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
32d80 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
32d90 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
32da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32db0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
32dc0 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75  B );.    pager_u
32dd0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
32de0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32df0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32e00 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65  _OPEN );.  }else
32e10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
32e20 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
32e30 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  DER;.  }.  retur
32e40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
32e50 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
32e60 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
32e70 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
32e80 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
32e90 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
32ea0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
32eb0 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
32ec0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
32ed0 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
32ee0 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
32ef0 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
32f00 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
32f10 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
32f20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
32f30 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
32f40 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
32f50 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
32f60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
32f70 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
32f80 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
32f90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
32fa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d   if( pPager->nMm
32fb0 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c  apOut==0 && (sql
32fc0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
32fd0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
32fe0 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
32ff0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
33000 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
33010 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
33020 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
33030 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
33040 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
33050 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
33060 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
33070 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
33080 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
33090 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
330a0 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
330b0 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
330c0 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
330d0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
330e0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
330f0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
33100 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
33110 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
33120 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
33130 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
33140 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
33150 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
33160 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
33170 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
33180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33190 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
331a0 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
331b0 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
331c0 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
331d0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
331e0 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
331f0 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
33200 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
33210 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
33220 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
33230 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
33240 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
33250 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
33260 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
33270 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
33280 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
33290 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
332a0 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
332b0 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
332c0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
332d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
332e0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
332f0 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
33300 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
33310 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
33320 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
33330 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
33340 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
33350 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
33360 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
33370 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
33380 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
33390 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
333a0 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
333b0 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
333c0 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
333d0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
333e0 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
333f0 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
33400 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
33410 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
33420 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
33430 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
33440 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
33450 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
33460 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
33470 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
33480 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
33490 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
334a0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
334b0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
334c0 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
334d0 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
334e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
334f0 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
33500 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
33510 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33520 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
33530 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
33540 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
33550 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
33560 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
33570 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
33580 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
33590 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
335a0 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
335b0 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
335c0 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
335d0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  l..**.** If noCo
335e0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ntent is true, t
335f0 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74  hen the data ret
33600 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20  urned is zeroed 
33610 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65  instead of.** be
33620 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ing read from th
33630 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
33640 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69  tionally, the bi
33650 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ts corresponding
33660 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50  .** to pgno in P
33670 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
33680 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73  (bitvec of pages
33690 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
336a0 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   to the.** journ
336b0 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
336c0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
336d0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
336e0 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e  vecs of any open
336f0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61  .** savepoints a
33700 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61  re set. This mea
33710 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ns if the page i
33720 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  s made writable 
33730 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20  at any.** point 
33740 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75  in the future, u
33750 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73  sing a call to s
33760 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33770 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  (), its contents
33780 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  .** will not be 
33790 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20  journaled. This 
337a0 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20  saves IO..**.** 
337b0 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
337c0 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
337d0 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
337e0 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
337f0 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
33800 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
33810 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
33820 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
33830 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
33840 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
33850 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
33860 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
33870 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
33880 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
33890 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
338a0 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
338b0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
338c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
338d0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
338e0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
338f0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
33900 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
33910 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
33920 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
33930 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
33940 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
33950 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
33960 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
33970 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
33980 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
33990 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
339a0 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
339b0 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
339c0 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
339d0 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
339e0 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
339f0 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
33a00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33a10 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
33a20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
33a30 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
33a40 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
33a50 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
33a60 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
33a70 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
33a80 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
33a90 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
33aa0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
33ab0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
33ac0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
33ad0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
33ae0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
33af0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
33b00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33b10 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
33b20 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72  g = 0;.  u32 iFr
33b30 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
33b40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d           /* Fram
33b50 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57  e to read from W
33b60 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e  AL file */.  con
33b70 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  st int noContent
33b80 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
33b90 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
33ba0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63  ;..  /* It is ac
33bb0 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20  ceptable to use 
33bc0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61  a read-only (mma
33bd0 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20  p) page for any 
33be0 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a  page except.  **
33bf0 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65   page 1 if there
33c00 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
33c10 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72  nsaction open or
33c20 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41   the ACQUIRE_REA
33c30 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20  DONLY.  ** flag 
33c40 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79  was specified by
33c50 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64   the caller. And
33c60 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   so long as the 
33c70 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a  db is not a .  *
33c80 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  * temporary or i
33c90 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
33ca0 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  e.  */.  const i
33cb0 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67  nt bMmapOk = (pg
33cc0 6e 6f 21 3d 31 20 26 26 20 55 53 45 46 45 54 43  no!=1 && USEFETC
33cd0 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20  H(pPager).   && 
33ce0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
33cf0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  =PAGER_READER ||
33d00 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
33d10 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23  GET_READONLY)).#
33d20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
33d30 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61  _CODEC.   && pPa
33d40 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23  ger->xCodec==0.#
33d50 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 61 73  endif.  );..  as
33d60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33d70 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
33d80 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
33d90 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
33da0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
33db0 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e  assert( noConten
33dc0 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d  t==0 || bMmapOk=
33dd0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  =0 );..  if( pgn
33de0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
33df0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
33e00 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
33e10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
33e20 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
33e30 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
33e40 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
33e50 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
33e60 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
33e70 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
33e80 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
33e90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
33ea0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
33eb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
33ec0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
33ed0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 4d  else{.    if( bM
33ee0 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73  mapOk && pagerUs
33ef0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
33f00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33f10 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
33f20 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
33f30 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
33f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33f50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
33f60 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
33f70 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d     }..    if( bM
33f80 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d  mapOk && iFrame=
33f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  =0 ){.      void
33fa0 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20   *pData = 0;..  
33fb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33fc0 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
33fd0 66 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  fd, .          (
33fe0 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
33ff0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
34000 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34010 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20 20  e, &pData.      
34020 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
34030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
34040 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
34050 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
34060 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20  te>PAGER_READER 
34070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
34080 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
34090 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
340a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  no);.        }. 
340b0 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
340c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
340d0 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65  c = pagerAcquire
340e0 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20  MapPage(pPager, 
340f0 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50  pgno, pData, &pP
34100 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  g);.        }els
34110 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
34120 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
34130 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
34140 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
34150 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
34160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34170 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
34180 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
341a0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50  ;.          *ppP
341b0 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  age = pPg;.     
341c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
341d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
341e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
341f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34200 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
34210 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34220 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34230 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  }..    {.      s
34240 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
34250 67 65 20 2a 70 42 61 73 65 3b 0a 20 20 20 20 20  ge *pBase;.     
34260 20 70 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33   pBase = sqlite3
34270 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
34280 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34290 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
342a0 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20   pBase==0 ){.   
342b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
342c0 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65  3PcacheFetchStre
342d0 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ss(pPager->pPCac
342e0 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65  he, pgno, &pBase
342f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34310 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34320 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34330 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61       pPg = *ppPa
34340 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
34350 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
34360 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34370 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 20  gno, pBase);.   
34380 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20     if( pPg==0 ) 
34390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
343a0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
343b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
343c0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
343d0 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
343e0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
343f0 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
34400 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
34410 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
34420 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
34430 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
34440 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
34450 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
34460 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
34470 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
34480 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
34490 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
344a0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
344b0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
344c0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
344d0 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
344e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
344f0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
34500 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61  pPager || (*ppPa
34510 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  ge)->pPager==0 )
34520 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  ;..  if( (*ppPag
34530 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  e)->pPager && !n
34540 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
34550 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
34560 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
34570 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
34580 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
34590 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
345a0 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
345b0 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
345c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
345d0 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
345e0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
345f0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
34600 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
34610 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
34620 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
34630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34640 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
34650 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
34660 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
34670 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
34680 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
34690 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
346a0 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20  alized.  */..   
346b0 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
346c0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
346d0 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
346e0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
346f0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
34700 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
34710 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
34720 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
34730 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
34740 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
34750 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
34760 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
34770 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
34780 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
34790 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
347a0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
347b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
347c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
347d0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
347e0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
347f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   }..    if( MEMD
34800 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  B || pPager->dbS
34810 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f  ize<pgno || noCo
34820 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e  ntent || !isOpen
34830 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
34840 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
34850 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
34860 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
34870 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
34880 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34890 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
348a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
348b0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
348c0 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
348d0 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
348e0 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
348f0 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
34900 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
34910 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
34920 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
34930 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
34940 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
34950 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
34960 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
34970 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
34980 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
34990 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
349a0 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
349b0 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
349c0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
349d0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
349e0 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
349f0 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
34a00 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
34a10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
34a20 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
34a30 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
34a40 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
34a50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
34a60 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
34a70 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
34a80 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
34a90 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
34aa0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
34ab0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
34ac0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
34ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34ae0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
34af0 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
34b00 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
34b10 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
34b20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
34b30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
34b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
34b50 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
34b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
34b70 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
34b80 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
34b90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
34ba0 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
34bb0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
34bc0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
34bd0 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72  .      if( pager
34be0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
34bf0 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a  & bMmapOk==0 ){.
34c00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34c10 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
34c20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
34c30 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
34c40 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
34c50 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34c60 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34c70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
34c80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
34c90 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
34ca0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
34cb0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d  tat[PAGER_STAT_M
34cc0 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63  ISS]++;.      rc
34cd0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
34ce0 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  g, iFrame);.    
34cf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34d00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
34d10 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34d20 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34d30 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
34d40 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
34d50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
34d60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
34d70 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
34d80 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
34d90 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
34da0 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
34db0 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
34dc0 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
34dd0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
34de0 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65  ger);..  *ppPage
34df0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
34e00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
34e10 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
34e20 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
34e30 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
34e40 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
34e50 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
34e60 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
34e70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
34e80 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
34e90 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
34ea0 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
34eb0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
34ec0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
34ed0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
34ee0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
34ef0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
34f00 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
34f10 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
34f20 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
34f30 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
34f40 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
34f50 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
34f60 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
34f70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
34f80 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
34f90 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
34fa0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
34fb0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
34fc0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
34fd0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
34fe0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
34ff0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
35000 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
35010 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
35020 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
35030 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
35040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
35050 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
35060 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
35070 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  e!=0 );.  pPage 
35080 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
35090 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
350a0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  ache, pgno, 0);.
350b0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
350c0 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73  PcacheFetchFinis
350d0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
350e0 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b  e, pgno, pPage);
350f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
35100 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
35110 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
35120 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
35130 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
35140 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
35150 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
35160 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
35170 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
35180 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
35190 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
351a0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
351b0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
351c0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
351d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
351e0 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
351f0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
35200 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50  UnrefNotNull(DbP
35210 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
35220 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73  er *pPager;.  as
35230 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a  sert( pPg!=0 );.
35240 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
35250 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
35260 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
35270 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67  _MMAP ){.    pag
35280 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
35290 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (pPg);.  }else{.
352a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
352b0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
352c0 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
352d0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
352e0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
352f0 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
35300 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
35310 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  Pg ) sqlite3Page
35320 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
35330 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  g);.}../*.** Thi
35340 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
35350 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
35360 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
35370 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
35380 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
35390 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
353a0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
353b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
353c0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
353d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
353e0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
353f0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
35400 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
35410 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
35420 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
35430 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
35440 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
35450 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
35460 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
35470 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
35480 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
35490 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
354a0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
354b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
354c0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
354d0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
354e0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
354f0 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
35500 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
35510 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
35520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
35530 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
35540 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
35550 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
35560 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
35570 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
35580 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
35590 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
355a0 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
355b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
355c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
355d0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
355e0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
355f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
35600 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
35610 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
35620 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
35630 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
35640 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
35650 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
35660 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
35670 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
35680 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
35690 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
356a0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
356b0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
356c0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
356d0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
356e0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
356f0 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
35700 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
35710 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
35720 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
35730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
35740 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
35750 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
35760 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
35770 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
35780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35790 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
357a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
357b0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
357c0 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
357d0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
357e0 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
357f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35800 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35810 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
35820 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
35830 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
35840 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
35850 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
35860 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
35870 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
35880 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
35890 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
358a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
358b0 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
358c0 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
358d0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
358e0 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
358f0 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
35900 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
35910 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
35920 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
35930 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
35940 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66  ->errCode;..  if
35950 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
35960 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
35970 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
35980 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35990 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67  _OFF ){.    pPag
359a0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
359b0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
359c0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
359d0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
359e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
359f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
35a00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
35a10 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
35a20 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
35a30 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
35a40 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
35a50 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
35a60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35a70 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
35a80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
35a90 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
35aa0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
35ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35ac0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
35ad0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
35ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35af0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
35b00 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
35b10 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
35b20 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
35b30 61 6c 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53  al file */.#if S
35b40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
35b50 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
35b60 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
35b70 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
35b80 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
35b90 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
35ba0 66 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  f.          SQLI
35bb0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
35bc0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
35bd0 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
35be0 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
35bf0 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  e ? .           
35c00 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
35c10 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
35c20 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
35c30 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
35c40 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
35c50 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
35c60 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20          );..    
35c70 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
35c80 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
35c90 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61  still has the sa
35ca0 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69  me name as it di
35cb0 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  d when.        *
35cc0 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61  * it was origina
35cd0 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20  lly opened. */. 
35ce0 20 20 20 20 20 20 20 72 63 20 3d 20 64 61 74 61         rc = data
35cf0 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50  baseIsUnmoved(pP
35d00 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
35d10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35d20 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
35d30 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
35d40 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20  WRITE.          
35d50 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
35d60 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20  nalOpen(.       
35d70 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
35d80 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
35d90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
35da0 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  s, jrnlBufferSiz
35db0 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20  e(pPager).      
35dc0 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
35dd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35de0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
35df0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
35e00 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
35e10 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  lags, 0);.#endif
35e20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35e30 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
35e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
35e50 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
35e60 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
35e70 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
35e80 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
35e90 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
35ea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
35eb0 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
35ec0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
35ed0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
35ee0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
35ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35f00 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
35f10 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
35f20 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
35f30 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
35f40 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
35f50 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
35f60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
35f70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
35f80 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
35f90 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
35fa0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
35fb0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
35fc0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
35fd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
35fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35ff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
36000 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
36010 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
36020 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
36030 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
36040 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
36050 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36060 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
36070 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
36080 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
36090 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
360a0 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
360b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
360c0 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
360d0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
360e0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
360f0 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
36100 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
36110 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
36120 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
36130 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
36140 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
36150 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
36160 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
36170 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
36180 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
36190 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
361a0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
361b0 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
361c0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
361d0 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
361e0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
361f0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
36200 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
36210 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
36220 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
36230 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
36240 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
36250 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
36260 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
36270 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
36280 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
36290 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
362a0 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
362b0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
362c0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
362d0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
362e0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
362f0 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
36300 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
36310 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
36320 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
36330 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
36340 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
36350 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
36360 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
36370 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
36380 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
36390 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
363a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
363b0 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
363c0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
363d0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
363e0 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
363f0 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
36400 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
36410 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36420 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
36430 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
36440 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
36450 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
36460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
36470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
36480 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
36490 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
364a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
364b0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
364c0 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
364d0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
364e0 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
364f0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
36500 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
36510 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
36520 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
36530 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
36540 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
36550 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
36560 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
36570 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
36580 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
36590 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
365a0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
365b0 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
365c0 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
365d0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
365e0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
365f0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
36600 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
36610 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
36620 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
36630 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
36640 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
36650 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
36660 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
36670 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
36680 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
36690 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
366a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
366b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
366c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
366d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
366e0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
366f0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
36700 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
36710 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
36720 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
36730 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
36740 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
36750 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
36760 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
36770 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
36780 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
36790 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
367a0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
367b0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
367c0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
367d0 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
367e0 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
367f0 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
36800 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
36810 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
36820 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
36830 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
36840 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  l it..      */. 
36850 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36860 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
36870 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
36880 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  ->pWal);.    }el
36890 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  se{.      /* Obt
368a0 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
368b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
368c0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
368d0 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
368e0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72  r.      ** is tr
368f0 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61  ue, then immedia
36900 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69  tely upgrade thi
36910 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  s to an EXCLUSIV
36920 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
36930 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
36940 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
36950 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
36960 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
36970 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20  LUSIVE.      ** 
36980 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
36990 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
369a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
369b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
369c0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
369d0 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
369e0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
369f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36a00 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  && exFlag ){.   
36a10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
36a20 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
36a30 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
36a40 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
36a50 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
36a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36a70 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
36a80 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
36a90 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
36aa0 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
36ab0 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61   sets Pager.eSta
36ac0 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54  te to PAGER_WRIT
36ad0 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43  ER_LOCKED or CAC
36ae0 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77  HEMOD.      ** w
36af0 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
36b00 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
36b10 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d  but never to DBM
36b20 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a  OD or FINISHED..
36b30 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
36b40 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73   because in thos
36b50 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64  e states the cod
36b60 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
36b70 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
36b80 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
36b90 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
36ba0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
36bb0 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
36bc0 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66  base .      ** f
36bd0 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69  ile as well as i
36be0 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
36bf0 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20  he. Which would 
36c00 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20  be incorrect in 
36c10 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
36c20 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
36c30 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
36c40 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
36c50 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70  _LOCKED;.      p
36c60 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
36c70 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36c80 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36c90 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
36ca0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
36cb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f       pPager->dbO
36cc0 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
36cd0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
36ce0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36cf0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ff = 0;.    }.. 
36d00 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
36d10 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
36d20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36d30 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
36d40 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
36d50 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
36d60 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36d70 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
36d80 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
36d90 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36da0 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20  Pager) );.  }.. 
36db0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52   PAGERTRACE(("TR
36dc0 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
36dd0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
36de0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
36df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
36e00 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67   single data pag
36e10 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
36e20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
36e30 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
36e40 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72   main journal or
36e50 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20   sub-journal as 
36e60 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65  required. If the
36e70 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
36e80 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20   into.** one of 
36e90 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  the journals, th
36ea0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
36eb0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
36ec0 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  e .** Pager.pInJ
36ed0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e  ournal bitvec an
36ee0 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
36ef0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
36f00 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20  t bitvecs.** of 
36f10 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  any open savepoi
36f20 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61  nts as appropria
36f30 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
36f40 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
36f50 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
36f60 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
36f70 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
36f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36f90 20 20 69 6e 74 20 69 6e 4a 6f 75 72 6e 61 6c 3b    int inJournal;
36fa0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
36fb0 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  ine is not calle
36fc0 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65  d unless a write
36fd0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
36fe0 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62   already .  ** b
36ff0 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65  een started. The
37000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
37010 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
37020 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69  open at this poi
37030 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  nt..  ** It is n
37040 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74  ever called in t
37050 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a  he ERROR state..
37060 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
37070 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37080 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37090 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  ED.       || pPa
370a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
370b0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
370c0 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
370d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
370e0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
370f0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
37100 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
37110 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
37120 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37130 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61  rrCode==0 );.  a
37140 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72  ssert( pPager->r
37150 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20  eadOnly==0 );.. 
37160 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
37170 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
37180 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
37190 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67  o be opened. Hig
371a0 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
371b0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  es have already.
371c0 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68    ** obtained th
371d0 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
371e0 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77  s to begin the w
371f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
37200 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72  , but the.  ** r
37210 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
37220 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
37230 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e   open. Open it n
37240 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ow if this is th
37250 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e case..  **.  *
37260 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  * This is done b
37270 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71  efore calling sq
37280 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
37290 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61  irty() on the pa
372a0 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ge. .  ** Otherw
372b0 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20  ise, if it were 
372c0 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69  done after calli
372d0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
372e0 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65  MakeDirty(), the
372f0 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
37300 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20  might occur and 
37310 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20  the pager would 
37320 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52  end up in WRITER
37330 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20  _LOCKED state.  
37340 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61  ** with pages ma
37350 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e  rked as dirty in
37360 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f   the cache..  */
37370 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
37380 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37390 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
373a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
373b0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
373c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
373d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
373e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
373f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37400 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
37410 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61  _CACHEMOD );.  a
37420 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37430 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37440 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  ) );..  /* Mark 
37450 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
37460 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
37470 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
37480 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
37490 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
374a0 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
374b0 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
374c0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
374d0 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
374e0 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 70 61    inJournal = pa
374f0 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67  geInJournal(pPag
37500 65 72 2c 20 70 50 67 29 3b 0a 20 20 69 66 28 20  er, pPg);.  if( 
37510 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
37520 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
37530 3d 3d 30 20 7c 7c 20 21 73 75 62 6a 52 65 71 75  ==0 || !subjRequ
37540 69 72 65 73 50 61 67 65 28 70 50 67 29 29 20 29  iresPage(pPg)) )
37550 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
37560 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
37570 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  r) );.  }else{. 
37580 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
37590 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
375a0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
375b0 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
375c0 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
375d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
375e0 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
375f0 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
37600 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
37610 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
37620 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
37630 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
37640 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
37650 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
37660 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 61  inJournal && !pa
37670 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
37680 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
37690 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
376a0 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
376b0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
376c0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
376d0 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70  Size && isOpen(p
376e0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
376f0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
37700 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
37710 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20  pData2;.        
37720 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65  i64 iOff = pPage
37730 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
37740 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
37750 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
37760 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
37770 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
37780 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
37790 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
377a0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
377b0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
377c0 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
377d0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
377e0 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
377f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
37800 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
37810 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
37820 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
37830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
37840 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
37850 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43  Off );.        C
37860 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50  ODEC2(pPager, pP
37870 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  g->pData, pPg->p
37880 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
37890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
378a0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  ta2);.        ck
378b0 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
378c0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
378d0 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20  Data2);..       
378e0 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
378f0 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
37900 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
37910 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
37920 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
37930 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
37940 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
37950 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
37960 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
37970 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
37980 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
37990 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
379a0 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
379b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
379c0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
379d0 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
379e0 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
379f0 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
37a00 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
37a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
37a20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
37a30 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37a40 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
37a50 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
37a60 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
37a70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
37a80 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
37a90 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
37aa0 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  C;..        rc =
37ab0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
37ac0 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20  ger->jfd, iOff, 
37ad0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
37ae0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37af0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
37b00 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
37b10 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
37b20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
37b30 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
37b40 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
37b50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37b60 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37b70 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
37b80 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
37b90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
37ba0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
37bb0 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  e+4, cksum);.   
37bc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
37bd0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
37be0 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54  rc;..        IOT
37bf0 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
37c00 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
37c10 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
37c20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
37c30 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
37c40 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
37c50 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
37c60 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
37c70 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
37c80 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
37c90 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
37ca0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
37cb0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
37cc0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
37cd0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
37ce0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
37cf0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
37d00 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
37d10 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
37d20 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
37d30 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
37d40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
37d50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38  >journalOff += 8
37d60 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
37d70 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ize;.        pPa
37d80 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
37d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
37da0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
37db0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
37dc0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
37dd0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
37de0 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
37df0 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
37e00 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
37e10 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
37e20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
37e30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
37e40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37e50 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64         rc |= add
37e60 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
37e70 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
37e80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
37e90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
37eb0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37ec0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
37ed0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
37f00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37f10 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
37f20 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
37f30 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
37f40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
37f50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37f60 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
37f70 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
37f80 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
37f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37fa0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
37fb0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
37fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
37fd0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
37fe0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
37ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
38000 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
38010 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
38020 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
38030 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
38040 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
38050 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
38060 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
38070 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
38080 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
38090 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
380a0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
380b0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
380c0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
380d0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
380e0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
380f0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
38100 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
38110 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
38120 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
38130 69 6e 74 3e 30 20 26 26 20 73 75 62 6a 52 65 71  int>0 && subjReq
38140 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
38150 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
38160 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
38170 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
38180 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
38190 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
381a0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
381b0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
381c0 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  <pPg->pgno ){.  
381d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
381e0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
381f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
38200 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
38210 61 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c  a variant of sql
38220 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
38230 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20   that runs when 
38240 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  the sector size.
38250 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
38260 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  n the page size.
38270 20 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 74    SQLite makes t
38280 68 65 20 28 72 65 61 73 6f 6e 61 62 6c 65 29 20  he (reasonable) 
38290 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 0a  assumption that.
382a0 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20 6f 66 20  ** all bytes of 
382b0 61 20 73 65 63 74 6f 72 20 61 72 65 20 77 72 69  a sector are wri
382c0 74 74 65 6e 20 74 6f 67 65 74 68 65 72 20 62 79  tten together by
382d0 20 68 61 72 64 77 61 72 65 2e 20 20 48 65 6e 63   hardware.  Henc
382e0 65 2c 20 61 6c 6c 20 62 79 74 65 73 20 6f 66 0a  e, all bytes of.
382f0 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e 65 65 64  ** a sector need
38300 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65   to be journalle
38310 64 20 69 6e 20 63 61 73 65 20 6f 66 20 61 20 70  d in case of a p
38320 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20 74 68 65  ower loss in the
38330 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 20   middle of.** a 
38340 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75  write..**.** Usu
38350 61 6c 6c 79 2c 20 74 68 65 20 73 65 63 74 6f 72  ally, the sector
38360 20 73 69 7a 65 20 69 73 20 6c 65 73 73 20 74 68   size is less th
38370 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
38380 68 65 20 70 61 67 65 20 73 69 7a 65 2c 20 69 6e  he page size, in
38390 20 77 68 69 63 68 0a 2a 2a 20 63 61 73 65 20 70   which.** case p
383a0 61 67 65 73 20 63 61 6e 20 62 65 20 69 6e 64 69  ages can be indi
383b0 76 69 64 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  vidually written
383c0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
383d0 6f 6e 6c 79 20 72 75 6e 73 20 69 6e 20 74 68 65  only runs in the
383e0 20 65 78 63 65 70 74 69 6f 6e 61 6c 0a 2a 2a 20   exceptional.** 
383f0 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 70  case where the p
38400 61 67 65 20 73 69 7a 65 20 69 73 20 73 6d 61 6c  age size is smal
38410 6c 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ler than the sec
38420 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  tor size..*/.sta
38430 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
38440 49 4e 45 20 69 6e 74 20 70 61 67 65 72 57 72 69  INE int pagerWri
38450 74 65 4c 61 72 67 65 53 65 63 74 6f 72 28 50 67  teLargeSector(Pg
38460 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
38470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
38480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
38490 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
384a0 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
384b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
384c0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
384d0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
384e0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
384f0 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
38500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38510 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
38520 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
38530 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
38540 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20   int nPage = 0; 
38550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38560 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
38570 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
38580 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
38590 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
385a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
385b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
385c0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 53  r */.  int needS
385d0 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
385e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
385f0 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47   any page has PG
38600 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f  HDR_NEED_SYNC */
38610 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
38620 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
38630 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
38640 68 61 74 20 6f 77 6e 73 20 70 50 67 20 2a 2f 0a  hat owns pPg */.
38650 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
38660 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
38670 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  &