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

Artifact 542bf64a097f84ab37319b90b5f2db1a4aab21968252c9e9d242eb85cf75f55d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ges */.  int (*x
8460: 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f  Get)(Pager*,Pgno
8470: 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20  ,DbPage**,int); 
8480: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 66 65  /* Routine to fe
8490: 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f 0a 23  tch a patch */.#
84a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
84b0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
84c0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
84d0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
84e0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
84f0: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
8500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8510: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
8520: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
8530: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
8540: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
8550: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
8560: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
8570: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
8580: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
8590: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
85a0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
85b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
85c0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
85d0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
85e0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
85f0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
8600: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
8610: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
8620: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
8630: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
8640: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
8650: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
8660: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
8670: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8680: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
8690: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
86b0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
86c0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
86d0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
86e0: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8700: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
8710: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
8720: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
8730: 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
8740: 0a 20 20 53 65 72 76 65 72 20 2a 70 53 65 72 76  .  Server *pServ
8750: 65 72 3b 0a 20 20 53 65 72 76 65 72 50 61 67 65  er;.  ServerPage
8760: 20 2a 70 53 65 72 76 65 72 50 61 67 65 3b 0a 23   *pServerPage;.#
8770: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
8780: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
8790: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
87a0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
87b0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
87c0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
87d0: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
87e0: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
87f0: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8800: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8810: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8820: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8830: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8840: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8850: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8860: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8870: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8880: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8890: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
88a0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
88b0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
88c0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
88d0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
88e0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
88f0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8900: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8910: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8920: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8930: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8940: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8950: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8960: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8970: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8990: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
89a0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
89b0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
89c0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
89d0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
89e0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
89f0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8a00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8a10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8a20: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8a30: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8a40: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8a50: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8a60: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8a70: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8a80: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8a90: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8aa0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ab0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8ac0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8ad0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8ae0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8af0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8b00: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8b10: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8b20: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8b30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8b40: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8b50: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8b60: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8b70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8b80: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8b90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8ba0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8bb0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8bc0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8bd0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8be0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8bf0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8c00: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8c10: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8c20: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8c40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8c50: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8c60: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8c70: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8c80: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8c90: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ca0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8cb0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8cc0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8cd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8ce0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8cf0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8d00: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8d10: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8d20: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8d30: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8d40: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8d50: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8d60: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8d70: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8d80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8d90: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8da0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8db0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8dc0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
8dd0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
8de0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
8df0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8e00: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
8e10: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
8e20: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
8e30: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
8e40: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
8e50: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
8e60: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
8e70: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
8e80: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
8e90: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
8ea0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
8eb0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
8ec0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
8ed0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
8ee0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
8ef0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
8f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
8f10: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
8f20: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
8f30: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
8f40: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
8f50: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
8f60: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
8f70: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
8f80: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
8f90: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
8fa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
8fb0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
8fc0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
8fd0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
8fe0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
8ff0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9000: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9010: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9020: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9030: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9040: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9050: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9060: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
9070: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
9080: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
9090: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
90a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
90b0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
90c0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
90d0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
90e0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
90f0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9100: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9110: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9120: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9130: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9140: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9150: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9160: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
9170: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9180: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
9190: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
91a0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
91b0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
91c0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
91d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
91e0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
91f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9200: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9210: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9220: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9230: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9240: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9250: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9260: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
9270: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
9280: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
9290: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
92a0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
92b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
92c0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
92d0: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
92e0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
92f0: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9300: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9310: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9320: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9330: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9340: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9350: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9360: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
9370: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
9380: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
9390: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
93a0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
93b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
93c0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
93d0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
93e0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
93f0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9400: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9410: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9420: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9430: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9440: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
9450: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
9460: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
9470: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
9480: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
9490: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
94a0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
94b0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
94c0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
94d0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
94e0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
94f0: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9500: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9510: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9520: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9530: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9540: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
9550: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
9560: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
9570: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
9580: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
9590: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
95a0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
95b0: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
95c0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
95d0: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
95e0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
95f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9600: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9610: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9620: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9630: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9640: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9650: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9660: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
9670: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
9680: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
9690: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
96a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
96b0: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
96c0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
96d0: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
96e0: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
96f0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9700: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9710: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9720: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9730: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9740: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9750: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9760: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
9770: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
9780: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
9790: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
97a0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
97b0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
97c0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
97d0: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
97e0: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
97f0: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  _OK.#endif..#ifd
9800: 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
9810: 5f 45 44 49 54 49 4f 4e 0a 23 20 64 65 66 69 6e  _EDITION.# defin
9820: 65 20 70 61 67 65 72 49 73 53 65 72 76 65 72 28  e pagerIsServer(
9830: 78 29 20 28 28 78 29 2d 3e 70 53 65 72 76 65 72  x) ((x)->pServer
9840: 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0).#else.# def
9850: 69 6e 65 20 70 61 67 65 72 49 73 53 65 72 76 65  ine pagerIsServe
9860: 72 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  r(x) 0.#endif..#
9870: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
9880: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
9890: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
98a0: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
98b0: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
98c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
98d0: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
98e0: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
98f0: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
9900: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
9910: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
9920: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
9930: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
9940: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
9950: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
9960: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
9970: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
9980: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
9990: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
99a0: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
99b0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
99c0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
99d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
99e0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
99f0: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
9a00: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9a10: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9a20: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9a30: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9a40: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
9a50: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9a60: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9a70: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
9a80: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9a90: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
9aa0: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9ab0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9ac0: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9ad0: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9ae0: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9af0: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
9b00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
9b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9b20: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
9b30: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
9b40: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
9b50: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
9b60: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
9b70: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
9b80: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
9b90: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
9ba0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9bb0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9bc0: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9bd0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9be0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9bf0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
9c00: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
9c10: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
9c20: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
9c30: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
9c40: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
9c50: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
9c60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9c70: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
9c80: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
9c90: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9ca0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9cb0: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9cc0: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9cd0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9ce0: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9cf0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9d00: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9d10: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9d20: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9d30: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9d40: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9d50: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
9d60: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
9d70: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
9d80: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
9d90: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
9da0: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9db0: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9dc0: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9dd0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9de0: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9df0: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9e00: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9e10: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9e20: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9e30: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9e40: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
9e50: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
9e60: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
9e70: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
9e80: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
9e90: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
9ea0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9eb0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9ec0: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9ed0: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9ee0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9ef0: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9f00: 28 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29  ( !isOpen(p->fd)
9f10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f20: 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20  p->noSync );.   
9f30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9f40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9f50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9f60: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9f70: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9f80: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
9f90: 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20  MORY .    );.   
9fa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9fb0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
9fc0: 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  && p->eState!=PA
9fd0: 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
9fe0: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
9ff0: 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d  Wal(p)==0 );.  }
a000: 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65  ..  /* If change
a010: 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74  CountDone is set
a020: 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  , a RESERVED loc
a030: 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
a040: 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f  t be held.  ** o
a050: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  n the file..  */
a060: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a070: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
a080: 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ne==0 || pPager-
a090: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a0a0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
a0b0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e  t( p->eLock!=PEN
a0c0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  DING_LOCK );..  
a0d0: 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74  switch( p->eStat
a0e0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
a0f0: 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20  GER_OPEN:.      
a100: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
a110: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a120: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a130: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a140: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a150: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
a160: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
a170: 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  e)==0 || pPager-
a180: 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
a190: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a1a0: 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52  ase PAGER_READER
a1b0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a1c0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a1d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a1e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a1f0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a200: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a210: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  rt( p->eLock>=SH
a220: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
a230: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a240: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a250: 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61  _LOCKED:.      a
a260: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a270: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
a280: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a290: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a2a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a2b0: 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65     if( !pagerUse
a2c0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
a2d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a2e0: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a2f0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a300: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a310: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
a320: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a330: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a340: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a350: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a360: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a370: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a380: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a390: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a3a0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
a3b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
a3c0: 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  aster==0 );.    
a3d0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a3e0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a3f0: 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20  CACHEMOD:.      
a400: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a410: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a420: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a430: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a450: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
a460: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
a470: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73          /* It is
a480: 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69   possible that i
a490: 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  f journal_mode=w
a4a0: 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69  al here that nei
a4b0: 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20 20  ther the.       
a4c0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
a4d0: 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c   nor the WAL fil
a4e0: 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73  e are open. This
a4f0: 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a   happens during.
a500: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c          ** a rol
a510: 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f  lback transactio
a520: 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73 20  n that switches 
a530: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  from journal_mod
a540: 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a  e=off.        **
a550: 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   to journal_mode
a560: 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  =wal..        */
a570: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a580: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a590: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a5a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a5b0: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a5c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a5d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a5e0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a5f0: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  F .             
a600: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a610: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a620: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a630: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
a640: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a650: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a660: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
a670: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a680: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a690: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a6a0: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a6b0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a6c0: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a6d0: 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  _DBMOD:.      as
a6e0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  sert( p->eLock==
a6f0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a700: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a710: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
a720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
a730: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
a740: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a750: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a760: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c  ( p->eLock>=EXCL
a770: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a780: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a790: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a7a0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a7b0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a7c0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a7e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a7f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a800: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a810: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a820: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c  ger->dbOrigSize<
a830: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
a840: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
a850: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a860: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
a870: 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  HED:.      asser
a880: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a890: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a8c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a8d0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a8e0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a8f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a900: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20  sOpen(p->jfd) . 
a910: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a920: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a930: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a940: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  FF .           |
a950: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a960: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a970: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
a980: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a990: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45      case PAGER_E
a9a0: 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54  RROR:.      /* T
a9b0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
a9c0: 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
a9d0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
a9e0: 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66 0a  to the pager if.
a9f0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f        ** in ERRO
aa00: 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
aa10: 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68 6f  se the pager sho
aa20: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
aa30: 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a   dropped.      *
aa40: 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  * back to OPEN s
aa50: 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
aa60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
aa70: 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
aa80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
aa90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
aaa0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
aab0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
aac0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
aad0: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
aae0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
aaf0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
ab00: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
ab10: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ab20: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
ab30: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
ab40: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
ab50: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
ab60: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
ab70: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ab80: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
ab90: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
aba0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
abb0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
abc0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
abd0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
abe0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
abf0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
ac00: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
ac10: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
ac20: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
ac30: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
ac40: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
ac50: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
ac60: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
ac70: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
ac80: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
ac90: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
aca0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
acb0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
acc0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
acd0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
ace0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
acf0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
ad00: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
ad10: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
ad20: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
ad30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
ad40: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ad50: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
ad60: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ad70: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
ad80: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
ad90: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
ada0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
adb0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
adc0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
add0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
ade0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
adf0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
ae00: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
ae10: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ae20: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ae30: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ae40: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ae50: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ae60: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ae70: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ae80: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ae90: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
aea0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aeb0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aec0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
aed0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
aee0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
aef0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
af00: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
af10: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
af20: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
af30: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
af40: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
af50: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
af60: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
af70: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
af80: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
af90: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
afa0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
afb0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
afc0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
afd0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
afe0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
aff0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
b000: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
b010: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
b020: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
b030: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
b040: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
b050: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
b060: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
b070: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
b080: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b090: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
b0a0: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
b0b0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b0c0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
b0d0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
b0e0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0f0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
b100: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
b110: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
b120: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
b130: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b140: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
b150: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
b160: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b170: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b180: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
b190: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
b1a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1c0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
b1d0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
b1e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b200: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
b210: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
b220: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b230: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b240: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
b250: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
b260: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b270: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b280: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
b290: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
b2a0: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2b0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
b2c0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
b2d0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
b2e0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
b2f0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
b300: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
b310: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b320: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b330: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b340: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b350: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b360: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
b370: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76 61 72  ences to the var
b380: 69 6f 75 73 20 70 61 67 65 20 67 65 74 74 65 72  ious page getter
b390: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
b3a0: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61  getPageNormal(Pa
b3b0: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b3c0: 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  **,int);.static 
b3d0: 69 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f 72  int getPageError
b3e0: 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50  (Pager*,Pgno,DbP
b3f0: 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20  age**,int);.#if 
b400: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b410: 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
b420: 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61  t getPageMMap(Pa
b430: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b440: 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  **,int);.#endif.
b450: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
b460: 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64  ager.xGet method
b470: 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72   for the appropr
b480: 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65  iate routine use
b490: 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f  d to fetch.** co
b4a0: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  ntent from the p
b4b0: 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ager..*/.static 
b4c0: 76 6f 69 64 20 73 65 74 47 65 74 74 65 72 4d 65  void setGetterMe
b4d0: 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67  thod(Pager *pPag
b4e0: 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
b4f0: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
b500: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b510: 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23   getPageError;.#
b520: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
b530: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73  AP_SIZE>0.  }els
b540: 65 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70  e if( USEFETCH(p
b550: 50 61 67 65 72 29 0a 23 69 66 64 65 66 20 53 51  Pager).#ifdef SQ
b560: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
b570: 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f    && pPager->xCo
b580: 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  dec==0.#endif.  
b590: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
b5a0: 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61  Get = getPageMMa
b5b0: 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  p;.#endif /* SQL
b5c0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b5d0: 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  E>0 */.  }else{.
b5e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b5f0: 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c   = getPageNormal
b600: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
b610: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b620: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b630: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b640: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b650: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b660: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b670: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b680: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b690: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b6a0: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b6b0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b6c0: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b6d0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b6e0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b6f0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b700: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b710: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b720: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b730: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b740: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b750: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b760: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b770: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b780: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b790: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b7a0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b7b0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b7c0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b7d0: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b7e0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b7f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b800: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b810: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b820: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b830: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b840: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b850: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b860: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b870: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b880: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b890: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b8a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b8b0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b8c0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b8d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b8e0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b8f0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b900: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b910: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b920: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b930: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b940: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b950: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b960: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b970: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b990: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b9a0: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b9b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b9c0: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b9d0: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b9e0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
ba00: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
ba10: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
ba20: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
ba30: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
ba40: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
ba50: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
ba60: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
ba70: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
ba80: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
ba90: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
baa0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
bab0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
bac0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
bad0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
bae0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
baf0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
bb00: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
bb10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bb20: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
bb30: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
bb40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bb50: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
bb60: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
bb70: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
bb80: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
bb90: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
bba0: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
bbb0: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
bbc0: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
bbd0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
bbe0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
bbf0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
bc00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
bc10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
bc20: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
bc30: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
bc40: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
bc50: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
bc60: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
bc70: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
bc80: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
bc90: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
bca0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
bcb0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
bcc0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
bcd0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
bce0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
bcf0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
bd00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
bd10: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
bd20: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
bd30: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
bd40: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
bd50: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
bd60: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bd70: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
bd80: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
bd90: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
bda0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
bdb0: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
bdc0: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
bdd0: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
bde0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
bdf0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
be00: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
be10: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
be20: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
be30: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
be40: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
be50: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
be60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
be70: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
be80: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
be90: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
bea0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
beb0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
bec0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bed0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
bee0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
bef0: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
bf00: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
bf10: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
bf20: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
bf30: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
bf40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
bf50: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
bf60: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
bf70: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
bf80: 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  rt( eLock!=NO_LO
bf90: 43 4b 20 7c 7c 20 70 61 67 65 72 49 73 53 65 72  CK || pagerIsSer
bfa0: 76 65 72 28 70 50 61 67 65 72 29 3d 3d 30 20 29  ver(pPager)==0 )
bfb0: 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
bfc0: 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
bfd0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bfe0: 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29  ->eLock>=eLock )
bff0: 3b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  ;.    rc = pPage
c000: 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49  r->noLock ? SQLI
c010: 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f  TE_OK : sqlite3O
c020: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
c030: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
c040: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
c050: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
c060: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
c070: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
c080: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  ck;.    }.    IO
c090: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
c0a0: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
c0b0: 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72   eLock)).  }.  r
c0c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c0d0: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61  ** Lock the data
c0e0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
c0f0: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
c100: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
c110: 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52  HARED_LOCK,.** R
c120: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
c130: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
c140: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
c150: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
c160: 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c   the.** Pager.eL
c170: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
c180: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
c190: 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  state. .**.** Ex
c1a0: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
c1b0: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
c1c0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
c1d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c1e0: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  s .** called, do
c1f0: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75   not modify it u
c200: 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f  nless the new lo
c210: 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45  cking state is E
c220: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a  XCLUSIVE_LOCK. .
c230: 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  ** See the comme
c240: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c250: 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f  fine of UNKNOWN_
c260: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
c270: 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74  anation .** of t
c280: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c290: 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50  nt pagerLockDb(P
c2a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c2b0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
c2c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c2d0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c2e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
c2f0: 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44   eLock==RESERVED
c300: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
c310: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
c320: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c330: 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70  eLock<eLock || p
c340: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
c350: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
c360: 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e    rc = pPager->n
c370: 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f  oLock ? SQLITE_O
c380: 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  K : sqlite3OsLoc
c390: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
c3a0: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ock);.    if( rc
c3b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
c3c0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
c3d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f  NKNOWN_LOCK||eLo
c3e0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
c3f0: 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  CK) ){.      pPa
c400: 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38  ger->eLock = (u8
c410: 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f  )eLock;.      IO
c420: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
c430: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
c440: 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d  Lock)).    }.  }
c450: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c460: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c470: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
c480: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
c490: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
c4a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
c4b0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
c4c0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
c4d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
c4e0: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
c4f0: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
c500: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
c510: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c520: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
c530: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
c540: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
c550: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
c560: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
c570: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
c580: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
c590: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
c5a0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
c5b0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
c5c0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
c5d0: 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  * The optimizati
c5e0: 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79  on is also alway
c5f0: 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65  s enabled for te
c600: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49  mporary files. I
c610: 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  t is.** an error
c620: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
c630: 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72  nction if pPager
c640: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e   is opened on an
c650: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
c660: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
c670: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
c680: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  n cannot be used
c690: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
c6a0: 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73   If it can be us
c6b0: 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ed,.** then the 
c6c0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
c6d0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
c6e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
c6f0: 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69  hen it.** contai
c700: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
c710: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
c720: 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   page..*/.#ifdef
c730: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
c740: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74  TOMIC_WRITE.stat
c750: 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65  ic int jrnlBuffe
c760: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
c770: 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
c780: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
c790: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
c7a0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b  e ){.    int dc;
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
c7d0: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
c7e0: 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tics */.    int 
c7f0: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nSector;        
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c810: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
c820: 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20      int szPage; 
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
c850: 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ze */..    asser
c860: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
c870: 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20  ->fd) );.    dc 
c880: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
c890: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
c8a0: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
c8b0: 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67    nSector = pPag
c8c0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
c8d0: 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61      szPage = pPa
c8e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
c8f0: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
c900: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
c910: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
c920: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
c930: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
c940: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
c950: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
c960: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
c970: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
c980: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
c990: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
c9a0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
c9b0: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
c9c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c9d0: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
c9e0: 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6c 73 65  pPager);.}.#else
c9f0: 0a 23 20 64 65 66 69 6e 65 20 6a 72 6e 6c 42 75  .# define jrnlBu
ca00: 66 66 65 72 53 69 7a 65 28 78 29 20 30 0a 23 65  fferSize(x) 0.#e
ca10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
ca20: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
ca30: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
ca40: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
ca50: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
ca60: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
ca70: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
ca80: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
ca90: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
caa0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
cab0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
cac0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cad0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
cae0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
caf0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
cb00: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
cb10: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
cb20: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
cb30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
cb40: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
cb50: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
cb60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
cb70: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
cb80: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
cb90: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
cba0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
cbb0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
cbc0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
cbd0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
cbe0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
cbf0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
cc00: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
cc10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
cc20: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
cc30: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
cc40: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
cc50: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
cc60: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
cc70: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cc80: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cc90: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
cca0: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
ccb0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
ccc0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
ccd0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
cce0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
ccf0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
cd00: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
cd10: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
cd20: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
cd30: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
cd40: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
cd50: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
cd60: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
cd70: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
cd80: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
cd90: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
cda0: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
cdb0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
cdc0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
cdd0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
cde0: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
cdf0: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
ce00: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
ce10: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
ce20: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
ce30: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
ce40: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
ce50: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
ce60: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
ce70: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
ce80: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
ce90: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
cea0: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
ceb0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
cec0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
ced0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cee0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
cef0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
cf00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cf10: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
cf20: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
cf30: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cf40: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
cf50: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
cf60: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
cf70: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
cf80: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
cf90: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
cfa0: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
cfb0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
cfc0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
cfd0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
cfe0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
cff0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
d000: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
d010: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
d020: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d030: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
d040: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
d050: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
d060: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
d070: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
d080: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
d090: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
d0a0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
d0b0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
d0c0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
d0d0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
d0e0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
d0f0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
d100: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d110: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
d120: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d130: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
d140: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
d150: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
d160: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
d170: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
d180: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
d190: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
d1a0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d1b0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
d1c0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
d1d0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
d1e0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d1f0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d200: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
d210: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
d220: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
d230: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
d240: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d250: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
d260: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
d270: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
d280: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
d290: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
d2a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
d2b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
d2c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
d2d0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
d2e0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d2f0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d300: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
d310: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
d320: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
d330: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d340: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d350: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
d360: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d370: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
d380: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
d390: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d3a0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
d3b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
d3c0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
d3d0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
d3e0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
d3f0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d410: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d420: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
d430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
d440: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
d450: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d460: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
d470: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
d480: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
d490: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
d4a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
d4b0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
d4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d4d0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
d4e0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
d4f0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d500: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d510: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
d520: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
d530: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d540: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
d550: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
d560: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
d570: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
d580: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
d590: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
d5a0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d5b0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
d5c0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
d5d0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
d5e0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d5f0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d600: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
d610: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
d620: 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20     || len==0 .  
d630: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d640: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d650: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
d660: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
d670: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d680: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d690: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
d6a0: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
d6b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
d6c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
d6d0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d6e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
d6f0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
d700: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
d710: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
d720: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
d730: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
d740: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
d750: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d760: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
d770: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
d780: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
d790: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
d7a0: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
d7b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
d7c0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
d7d0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
d7e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
d7f0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
d800: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d810: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d820: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
d830: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
d840: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
d850: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
d860: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
d870: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
d880: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
d890: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
d8a0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
d8b0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
d8c0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
d8d0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
d8e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d900: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
d910: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
d920: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
d930: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
d940: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
d950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d960: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
d970: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
d980: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
d990: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
d9a0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
d9b0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
d9c0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
d9d0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
d9e0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
d9f0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
da00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
da20: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
da30: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
da40: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
da50: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
da60: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
da80: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
dab0: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
dac0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
dad0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
dae0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
daf0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
db00: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
db10: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
db20: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
db30: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
db40: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
db50: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
db60: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
db70: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
db80: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
db90: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
dba0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
dbb0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
dbc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dbd0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
dbe0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
dbf0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
dc00: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
dc10: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
dc20: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
dc30: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
dc40: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
dc50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
dc60: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
dc70: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
dc80: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
dc90: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
dca0: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
dcb0: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
dcc0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
dcd0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
dce0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
dcf0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
dd00: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
dd10: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
dd20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
dd30: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
dd40: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
dd50: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
dd60: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
dd70: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
dd80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
dd90: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
dda0: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
ddb0: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
ddc0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
ddd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
dde0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
ddf0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
de00: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
de10: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
de20: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
de30: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
de40: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
de50: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
de60: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
de70: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
de80: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
de90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
dea0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
deb0: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
dec0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
ded0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
dee0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
def0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
df00: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
df10: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
df20: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
df30: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
df40: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
df50: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
df60: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
df70: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
df80: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
df90: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
dfa0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
dfb0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
dfc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
dfd0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
dfe0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
dff0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
e000: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
e010: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e040: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
e050: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
e060: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
e070: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
e080: 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
e090: 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  mory(pPager->jfd
e0a0: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
e0b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
e0c0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
e0d0: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
e0e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
e0f0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
e100: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
e110: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
e120: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
e130: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
e140: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
e150: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
e160: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
e170: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
e180: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
e190: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
e1a0: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
e1b0: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
e1c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e1d0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
e1e0: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
e1f0: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
e200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e210: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e220: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
e230: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e240: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
e250: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
e260: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
e270: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
e280: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e290: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
e2a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
e2b0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
e2c0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
e2d0: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
e2e0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
e2f0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
e300: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
e310: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
e320: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
e330: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
e340: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
e350: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
e360: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
e370: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
e380: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
e390: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
e3a0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
e3b0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
e3c0: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
e3d0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
e3e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
e3f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e400: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
e410: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
e420: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e430: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
e440: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
e450: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e460: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
e470: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e480: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
e490: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
e4a0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e4b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
e4c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e4d0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
e4e0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
e4f0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
e500: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
e510: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
e520: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e530: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
e540: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e550: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
e560: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
e570: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
e580: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
e590: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
e5a0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
e5b0: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
e5c0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
e5d0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
e5e0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
e5f0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
e600: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
e610: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
e620: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e630: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
e640: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
e650: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e660: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
e670: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e680: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e690: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e6a0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e6b0: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e6c0: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e6d0: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e6e0: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e6f0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e700: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e710: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e720: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e730: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e740: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e750: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e760: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e780: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e790: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e7a0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e7b0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e7c0: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e7d0: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e7e0: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e7f0: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e800: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e810: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e820: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e830: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e860: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e870: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e880: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e8a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e8b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e8c0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e8d0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e8e0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e8f0: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e900: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e910: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e920: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e930: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e940: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e950: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e960: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e970: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e980: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e990: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e9a0: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e9b0: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e9c0: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e9d0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e9e0: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e9f0: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
ea00: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
ea10: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
ea20: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
ea30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
ea40: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
ea50: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
ea60: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
ea70: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
ea80: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
ea90: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
eaa0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
eab0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
eac0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ead0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
eae0: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
eaf0: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
eb00: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
eb10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
eb20: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
eb30: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
eb40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
eb50: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
eb60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
eb70: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
eb80: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
eb90: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
eba0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
ebb0: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
ebc0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
ebd0: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
ebe0: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
ebf0: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
ec00: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
ec10: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
ec20: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
ec30: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
ec40: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
ec50: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
ec60: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
ec70: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
ec80: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
ec90: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
eca0: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
ecb0: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
ecc0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
ecd0: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
ece0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
ecf0: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
ed00: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
ed10: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
ed20: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
ed30: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
ed40: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
ed50: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
ed60: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
ed70: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
ed80: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
ed90: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
eda0: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
edb0: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
edc0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
edd0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
ede0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
edf0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
ee00: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
ee10: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
ee20: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
ee30: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
ee40: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
ee50: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
ee60: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
ee70: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
ee80: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
ee90: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
eea0: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
eeb0: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
eec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
eed0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
eee0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
eef0: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
ef00: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
ef10: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
ef20: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
ef30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ef40: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
ef50: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
ef60: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
ef70: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
ef80: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
ef90: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
efa0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
efb0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
efc0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
efd0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
efe0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
eff0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f000: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
f010: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
f020: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
f030: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
f040: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f050: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
f060: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
f070: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
f080: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
f090: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
f0a0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f0b0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
f0c0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
f0d0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f0e0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f0f0: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
f100: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
f110: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
f120: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
f130: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f140: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f150: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
f160: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
f170: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
f180: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
f190: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
f1a0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f1b0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f1c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
f1d0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
f1e0: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
f1f0: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
f200: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f210: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f220: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
f230: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
f240: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
f250: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
f260: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
f270: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
f280: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
f290: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
f2a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
f2b0: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
f2c0: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
f2d0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
f2e0: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
f2f0: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
f300: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
f310: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
f320: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
f330: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
f340: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
f350: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f360: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
f370: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
f380: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
f390: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
f3a0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
f3b0: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
f3c0: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
f3d0: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
f3e0: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
f3f0: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
f400: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
f410: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
f420: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
f430: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
f440: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
f450: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
f460: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
f470: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
f480: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
f490: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
f4a0: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
f4b0: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
f4c0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
f4d0: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
f4e0: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
f4f0: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
f500: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
f510: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
f520: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
f530: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
f540: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
f550: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
f560: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
f570: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f580: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
f590: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
f5a0: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
f5b0: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
f5c0: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
f5d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
f5e0: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
f5f0: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
f600: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
f610: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
f620: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
f630: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
f640: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
f650: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
f660: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
f670: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f680: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f690: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f6a0: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f6b0: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f6c0: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f6d0: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f6e0: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f6f0: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f700: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f710: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f720: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f730: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f740: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f750: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f760: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f770: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f780: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f790: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f7a0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f7b0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f7c0: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f7d0: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f7e0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f7f0: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f800: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f810: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f830: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f840: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f850: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f860: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f870: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f880: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f890: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f8a0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f8b0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f8c0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f8d0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f8e0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f8f0: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f900: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f910: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f920: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f930: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f940: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f950: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f960: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f970: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f980: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f990: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f9a0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f9b0: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f9c0: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f9d0: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f9e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f9f0: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
fa00: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
fa10: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
fa20: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
fa30: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
fa40: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
fa50: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
fa60: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
fa70: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
fa80: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
fa90: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
faa0: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
fab0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fac0: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
fad0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
fae0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
faf0: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
fb00: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
fb10: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
fb20: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
fb30: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
fb40: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
fb50: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
fb60: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
fb70: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
fb80: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
fb90: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
fba0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
fbb0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
fbc0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
fbd0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
fbe0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
fbf0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
fc00: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
fc10: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
fc20: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
fc30: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
fc40: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
fc50: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
fc60: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
fc70: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
fc80: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
fc90: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
fca0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fcc0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
fcd0: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
fce0: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
fcf0: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
fd00: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
fd10: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
fd20: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
fd30: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
fd40: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
fd50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
fd60: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
fd70: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
fd80: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
fd90: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
fda0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
fdb0: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
fdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fdd0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
fde0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
fdf0: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
fe00: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
fe10: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
fe20: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
fe30: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
fe40: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
fe50: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
fe60: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
fe70: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
fe80: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
fe90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
fea0: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
feb0: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
fec0: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
fed0: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
fee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fef0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
ff00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
ff10: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
ff20: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
ff30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ff40: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
ff50: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
ff60: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
ff70: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
ff80: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
ff90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ffa0: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
ffb0: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
ffc0: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
ffd0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
ffe0: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
fff0: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
10000 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
10010 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
10020 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
10030 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
10040 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
10050 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
10060 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
10070 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
10080 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
10090 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
100a0 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
100b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
100c0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
100d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
100e0 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
100f0 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
10100 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
10110 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
10120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10130 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
10140 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
10150 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
10160 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
10170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10180 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
10190 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
101a0 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
101b0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
101c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
101d0 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
101e0 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
101f0 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
10200 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
10210 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
10220 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
10230 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
10240 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
10250 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
10260 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
10270 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
10280 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
10290 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
102a0 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
102b0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
102c0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
102d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
102e0 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
102f0 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
10300 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
10310 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10320 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10330 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
10340 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
10350 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
10360 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10370 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
10380 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
10390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
103a0 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
103b0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
103c0 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
103d0 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
103e0 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
103f0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
10400 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
10410 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
10420 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
10430 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
10440 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
10450 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
10460 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10470 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10480 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
10490 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
104a0 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
104b0 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
104c0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
104d0 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
104e0 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
104f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10500 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10510 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
10520 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
10530 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
10540 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
10550 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
10560 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
10570 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
10580 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
10590 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
105a0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
105b0 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
105c0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
105d0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
105e0 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
105f0 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
10600 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
10610 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
10620 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
10630 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
10640 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
10650 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
10660 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
10670 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
10680 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10690 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
106a0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
106b0 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
106c0 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
106d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
106e0 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
106f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10700 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10710 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
10720 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
10730 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10740 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
10770 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
10780 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10790 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
107a0 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
107b0 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
107c0 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
107d0 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
107e0 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
107f0 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10800 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10810 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
10820 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
10830 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
10840 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
10850 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
10860 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
10870 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10880 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10890 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
108a0 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
108b0 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
108c0 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
108d0 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
108e0 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
108f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10900 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10910 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10930 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
10940 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
10950 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10960 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
10970 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
10980 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10990 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
109a0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
109b0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
109c0 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
109d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
109e0 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
109f0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10a00 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10a10 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
10a20 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
10a30 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
10a40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
10a50 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
10a60 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
10a70 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10a80 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10a90 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10aa0 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10ab0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10ac0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10ad0 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10ae0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10af0 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10b00 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10b10 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
10b20 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
10b30 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
10b40 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
10b50 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
10b60 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
10b70 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10b80 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10b90 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10ba0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10bb0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10bc0 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10bd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10be0 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10bf0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10c10 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
10c20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
10c30 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
10c40 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
10c50 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
10c60 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
10c70 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10c80 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10c90 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10ca0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10cb0 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10cd0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10ce0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10cf0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10d00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10d10 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
10d20 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
10d30 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
10d40 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
10d50 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
10d60 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
10d70 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10d80 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10d90 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10da0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10db0 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10dc0 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10dd0 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10de0 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10df0 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10e00 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10e10 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
10e20 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
10e30 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
10e40 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
10e50 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
10e60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10e70 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10e80 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10e90 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10ea0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10eb0 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10ec0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10ed0 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10ee0 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10ef0 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10f00 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10f10 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
10f20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
10f30 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
10f40 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
10f50 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
10f60 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
10f70 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10f80 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10f90 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10fa0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10fd0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10ff0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
11000 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
11010 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
11020 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
11030 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
11040 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
11050 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
11060 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
11090 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
110a0 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
110b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
110c0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
110d0 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
110e0 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
110f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
11100 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
11110 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
11120 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
11130 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
11140 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
11150 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
11160 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
11170 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
11180 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
11190 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
111a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
111b0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
111c0 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
111d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
111e0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
111f0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
11200 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
11210 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
11220 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
11230 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
11240 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
11250 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11260 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
11270 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
11280 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
11290 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
112a0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
112b0 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
112c0 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
112d0 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
112e0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
112f0 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
11300 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
11310 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
11320 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
11330 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
11340 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
11350 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
11360 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
11370 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
11380 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
11390 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
113a0 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
113b0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
113c0 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
113d0 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
113e0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
113f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
11400 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
11410 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
11420 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
11430 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
11440 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
11450 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
11460 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
11470 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11480 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
11490 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
114a0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
114b0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
114c0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
114d0 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
114e0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
114f0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11500 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
11510 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
11520 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
11530 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
11540 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11550 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11560 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
11570 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
11580 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
11590 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
115a0 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
115b0 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20 20  lMagic, 8,.     
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64 72              iHdr
115e0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
115f0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
11600 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
11610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11620 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
11630 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
11640 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
11650 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
11660 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
11670 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
11680 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
11690 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
116a0 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
116b0 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
116c0 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
116d0 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
116e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
116f0 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
11700 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
11710 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
11720 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
11730 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
11740 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
11750 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
11760 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
11770 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
11780 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
11790 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
117a0 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
117b0 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
117c0 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
117d0 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
117e0 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
117f0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
11800 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
11810 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
11820 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
11830 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
11840 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
11850 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
11860 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
11870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
11880 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11890 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
118a0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
118b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
118c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
118d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
118e0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
118f0 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
11900 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
11910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11920 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
11930 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
11940 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11950 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  ion++;.  sqlite3
11960 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
11970 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
11980 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
11990 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
119a0 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
119b0 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65  Return the pPage
119c0 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20  r->iDataVersion 
119d0 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c  value.*/.u32 sql
119e0 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72  ite3PagerDataVer
119f0 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  sion(Pager *pPag
11a00 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
11a10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
11a20 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65  GER_OPEN );.  re
11a30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61  turn pPager->iDa
11a40 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  taVersion;.}../*
11a50 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
11a60 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
11a70 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
11a80 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
11a90 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
11aa0 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
11ab0 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
11ac0 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
11ad0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
11ae0 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
11af0 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
11b00 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
11b10 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
11b20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
11b30 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20  avepoints(Pager 
11b40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
11b50 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11b60 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
11b70 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
11b80 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  h Pager.aSavepoi
11b90 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  nt */.  for(ii=0
11ba0 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11bb0 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11bc0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
11bd0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11be0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
11bf0 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
11c00 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
11c10 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11c20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  || sqlite3Journa
11c30 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
11c40 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
11c50 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11c60 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
11c70 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
11c80 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  e(pPager->aSavep
11c90 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d  oint);.  pPager-
11ca0 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >aSavepoint = 0;
11cb0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  .  pPager->nSave
11cc0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
11cd0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
11ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11cf0 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
11d00 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
11d10 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
11d20 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63  point .** bitvec
11d30 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61  s of all open sa
11d40 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e  vepoints. Return
11d50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
11d60 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53  ccessful.** or S
11d70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
11d80 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
11d90 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
11da0 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70  c int addToSavep
11db0 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65  ointBitvecs(Page
11dc0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
11dd0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  pgno){.  int ii;
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11e00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
11e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
11e20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11e30 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b   */..  for(ii=0;
11e40 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11e50 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11e60 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
11e70 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
11e80 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a  aSavepoint[ii];.
11e90 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d      if( pgno<=p-
11ea0 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >nOrig ){.      
11eb0 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74  rc |= sqlite3Bit
11ec0 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76  vecSet(p->pInSav
11ed0 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  epoint, pgno);. 
11ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11ef0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11f00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
11f20 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
11f30 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
11f40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
11f60 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 73 74 61  RVER_EDITION.sta
11f70 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
11f80 65 65 53 65 72 76 65 72 50 61 67 65 28 50 61 67  eeServerPage(Pag
11f90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 53  er *pPager){.  S
11fa0 65 72 76 65 72 50 61 67 65 20 2a 70 50 67 3b 0a  erverPage *pPg;.
11fb0 20 20 53 65 72 76 65 72 50 61 67 65 20 2a 70 4e    ServerPage *pN
11fc0 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  ext;.  for(pPg=p
11fd0 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 50 61  Pager->pServerPa
11fe0 67 65 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ge; pPg; pPg=pNe
11ff0 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
12000 20 70 50 67 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pPg->pNext;.   
12010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
12020 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
12030 2d 3e 70 53 65 72 76 65 72 50 61 67 65 20 3d 20  ->pServerPage = 
12040 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
12050 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12060 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
12070 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
12080 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12090 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
120a0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
120b0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
120c0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
120d0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
120e0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
120f0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
12100 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
12110 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
12120 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
12130 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
12140 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
12150 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
12160 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
12170 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
12180 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
12190 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
121a0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
121b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
121c0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
121d0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
121e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
121f0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
12200 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12210 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
12220 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
12230 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12240 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
12250 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
12260 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
12270 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
12280 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
12290 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
122a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
122b0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
122c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
122d0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
122e0 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
122f0 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
12300 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
12310 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
12320 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
12330 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
12340 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
12350 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
12360 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
12370 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12380 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
12390 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
123a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
123b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
123c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
123d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
123e0 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
123f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12400 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
12410 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
12420 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
12430 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
12440 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
12450 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
12460 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
12470 73 28 70 50 61 67 65 72 29 3b 0a 0a 23 69 66 64  s(pPager);..#ifd
12480 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
12490 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 70  _EDITION.  if( p
124a0 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50 61  agerIsServer(pPa
124b0 67 65 72 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ger) ){.    page
124c0 72 46 72 65 65 53 65 72 76 65 72 50 61 67 65 28  rFreeServerPage(
124d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
124e0 69 74 65 33 53 65 72 76 65 72 45 6e 64 28 70 50  ite3ServerEnd(pP
124f0 61 67 65 72 2d 3e 70 53 65 72 76 65 72 29 3b 0a  ager->pServer);.
12500 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12510 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12520 0a 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66  .  }else .#endif
12530 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
12540 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
12550 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
12560 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
12570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
12580 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
12590 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
125a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
125b0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
125c0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
125d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
125e0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
125f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
12610 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
12620 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
12630 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
12640 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
12650 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
12660 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
12670 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
12680 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
12690 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
126a0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
126b0 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
126c0 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
126d0 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
126e0 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
126f0 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
12700 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
12710 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
12720 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
12730 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
12740 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
12750 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
12760 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
12770 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
12780 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12790 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
127a0 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
127b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
127c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
127d0 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
127e0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
127f0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12800 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
12810 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12820 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12830 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
12840 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12850 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12860 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
12870 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
12880 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12890 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
128a0 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
128b0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
128c0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
128d0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
128e0 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
128f0 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
12900 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
12910 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12920 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
12930 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
12940 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12950 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
12960 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12970 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
12980 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
12990 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
129a0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
129b0 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
129c0 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
129d0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
129e0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
129f0 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
12a00 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
12a10 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
12a20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
12a30 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
12a40 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
12a50 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
12a60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12a70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
12a80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12a90 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
12aa0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
12ab0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
12ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
12ad0 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
12ae0 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
12af0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
12b00 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
12b10 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
12b20 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
12b30 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
12b40 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
12b50 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
12b60 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
12b70 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
12b80 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
12b90 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
12ba0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12bb0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
12bc0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
12bd0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
12be0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12bf0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
12c00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12c10 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
12c20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
12c30 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
12c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12c50 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12c60 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
12c70 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
12c80 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
12c90 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
12ca0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
12cb0 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
12cc0 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
12cd0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
12ce0 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
12cf0 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
12d00 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
12d10 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
12d20 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
12d30 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12d40 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
12d50 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
12d60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12d70 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
12d80 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
12d90 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
12da0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
12db0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12dc0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
12de0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
12df0 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  N;.    }else{.  
12e00 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12e10 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61  te = (isOpen(pPa
12e20 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45  ger->jfd) ? PAGE
12e30 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52  R_OPEN : PAGER_R
12e40 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  EADER);.    }.  
12e50 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
12e60 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
12e70 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
12e80 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
12e90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12ea0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12eb0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
12ec0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
12ed0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12ee0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12ef0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12f00 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
12f10 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
12f20 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12f30 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12f40 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12f50 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12f60 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12f70 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12f80 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12f90 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12fa0 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12fb0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12fc0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12fd0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12fe0 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12ff0 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
13000 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
13010 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
13020 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
13030 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
13040 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
13050 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
13060 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
13070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
13080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
13090 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
130a0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
130b0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
130c0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
130d0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
130e0 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
130f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
13100 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
13110 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
13120 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
13130 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
13140 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
13150 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
13160 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
13170 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
13180 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
13190 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
131a0 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
131b0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
131c0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
131d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
131e0 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
131f0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
13200 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
13210 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
13220 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
13230 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
13240 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
13250 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
13260 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13270 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
13280 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
13290 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
132a0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
132b0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
132c0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
132d0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
132e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
132f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13300 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
13310 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
13320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13330 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
13340 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
13350 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
13360 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
13370 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
13380 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
13390 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
133a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
133b0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
133c0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
133d0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
133e0 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
133f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
13400 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
13410 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
13420 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
13430 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
13440 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
13450 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
13460 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
13470 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
13480 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65  OR;.    setGette
13490 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
134a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
134b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
134c0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
134d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
134e0 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
134f0 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e  * The write tran
13500 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20  saction open on 
13510 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20  pPager is being 
13520 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d  committed (bComm
13530 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c  it==1).** or rol
13540 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69  led back (bCommi
13550 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  t==0)..**.** Ret
13560 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20  urn TRUE if and 
13570 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74  only if all dirt
13580 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  y pages should b
13590 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
135a0 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a  k..**.** Rules:.
135b0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e  **.**   *  For n
135c0 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65  on-TEMP database
135d0 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74  s, always sync t
135e0 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73  o disk.  This is
135f0 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20   necessary.**   
13600 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69     for transacti
13610 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c  ons to be durabl
13620 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79  e..**.**   *  Sy
13630 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  nc TEMP database
13640 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49   only on a COMMI
13650 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43  T (not a ROLLBAC
13660 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b  K) when the back
13670 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  ing.**      file
13680 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
13690 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61  d already (via a
136a0 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53   spill on pagerS
136b0 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20  tress()) and.** 
136c0 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75       when the nu
136d0 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61  mber of dirty pa
136e0 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78  ges in memory ex
136f0 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65  ceeds 25% of the
13700 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63   total.**      c
13710 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  ache size..*/.st
13720 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c  atic int pagerFl
13730 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65  ushOnCommit(Page
13740 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62  r *pPager, int b
13750 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70  Commit){.  if( p
13760 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
13770 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
13780 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20   if( !bCommit ) 
13790 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
137a0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
137b0 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
137c0 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65    return (sqlite
137d0 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69  3PCachePercentDi
137e0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
137f0 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a  che)>=25);.}../*
13800 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13810 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
13820 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
13830 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
13840 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
13850 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
13860 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
13870 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
13880 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
13890 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
138a0 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
138b0 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
138c0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
138d0 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
138e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
138f0 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
13900 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
13910 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
13920 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
13930 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
13940 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
13950 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
13960 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
13970 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
13980 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
13990 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
139a0 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
139b0 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
139c0 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
139d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
139e0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
139f0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
13a00 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
13a10 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
13a20 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
13a30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13a40 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
13a50 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
13a60 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
13a70 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
13a80 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
13a90 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13aa0 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
13ab0 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
13ac0 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
13ad0 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
13ae0 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
13af0 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
13b00 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
13b10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13b20 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
13b30 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13b40 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
13b50 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
13b60 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
13b70 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
13b80 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
13b90 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
13ba0 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
13bb0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
13bc0 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
13bd0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13be0 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
13bf0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
13c00 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
13c10 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
13c20 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
13c30 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
13c40 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
13c50 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
13c60 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
13c70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
13c80 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
13c90 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
13ca0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13cb0 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
13cc0 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
13cd0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
13ce0 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
13cf0 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
13d00 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
13d10 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
13d20 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
13d30 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
13d40 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
13d50 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
13d60 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
13d70 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
13d80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
13d90 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13da0 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
13db0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
13dc0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
13dd0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
13de0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
13df0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
13e00 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
13e10 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
13e20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
13e30 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
13e40 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
13e50 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
13e60 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
13e70 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
13e80 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
13e90 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
13ea0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
13eb0 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
13ec0 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
13ed0 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
13ee0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
13ef0 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
13f00 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
13f10 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13f20 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
13f30 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
13f40 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
13f50 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
13f60 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
13f70 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
13f80 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
13f90 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
13fa0 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
13fb0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
13fc0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
13fd0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
13fe0 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
13ff0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
14000 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
14010 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
14020 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
14030 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
14040 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
14050 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
14060 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14070 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
14080 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
14090 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
140a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
140b0 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
140c0 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
140d0 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
140e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
140f0 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
14100 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
14110 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
14120 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
14130 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
14140 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
14150 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
14160 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
14170 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
14180 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
14190 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
141a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
141b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
141c0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
141d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
141e0 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
141f0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
14200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
14210 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14220 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
14230 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
14240 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
14250 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
14260 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14270 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
14280 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
14290 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
142a0 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
142b0 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
142c0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
142d0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
142e0 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
142f0 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
14300 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
14310 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
14320 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
14330 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14340 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
14350 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
14360 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
14370 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
14380 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
14390 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
143a0 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
143b0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
143c0 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
143d0 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
143e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
143f0 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
14400 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
14410 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
14420 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
14430 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
14440 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
14450 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
14460 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
14470 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
14480 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
14490 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
144a0 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
144b0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
144c0 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
144d0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
144e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
144f0 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
14500 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14510 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
14520 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
14530 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
14540 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
14550 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14560 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
14570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
14580 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
14590 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
145a0 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
145b0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
145c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
145d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
145e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
145f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
14600 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
14610 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
14620 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14630 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
14640 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
14650 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
14660 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
14670 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
14680 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
14690 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
146a0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
146b0 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
146c0 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
146d0 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
146e0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
146f0 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
14700 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14710 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14720 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a  MODE_MEMORY ); *
14730 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
14740 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14750 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
14760 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14770 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14780 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
14790 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
147a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
147b0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
147c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
147d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
147e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
147f0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
14800 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
14810 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14820 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14830 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
14840 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
14850 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69   sure the new fi
14860 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74  le size is writt
14870 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64  en into the inod
14880 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  e right away..  
14890 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
148a0 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wise the journal
148b0 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74   might resurrect
148c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
148d0 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20  er loss and.    
148e0 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
148f0 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74  he last transact
14900 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ion to roll back
14910 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20  .  See.         
14920 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a   ** https://bugz
14930 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67  illa.mozilla.org
14940 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
14950 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20  =1072773.       
14960 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14970 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
14980 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
14990 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
149a0 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
149b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
149c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
149d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
149e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
149f0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14a00 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
14a10 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
14a20 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14a30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
14a40 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
14a50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
14a60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
14a70 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
14a80 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
14a90 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  er||pPager->temp
14aa0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61  File);.      pPa
14ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14ac0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
14ad0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
14ae0 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
14af0 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
14b00 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
14b10 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
14b20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
14b30 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
14b40 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
14b50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
14b60 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
14b70 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
14b80 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
14b90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
14ba0 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
14bb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14bc0 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
14bd0 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
14be0 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ry journal..    
14bf0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62    */.      int b
14c00 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72  Delete = !pPager
14c10 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
14c20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14c30 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
14c40 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d  ry(pPager->jfd)=
14c50 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
14c60 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14c70 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14c80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
14c90 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
14ca0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14cb0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14cc0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
14cd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
14ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14cf0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14d00 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
14d10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14d20 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
14d30 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
14d40 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  bDelete ){.     
14d50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14d60 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14d70 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
14d80 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
14d90 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20  extraSync);.    
14da0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
14db0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
14dc0 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
14dd0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
14de0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
14df0 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
14e00 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
14e10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
14e20 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
14e30 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
14e40 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
14e50 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
14e60 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
14e70 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  kup(pPager, 1);.
14e80 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
14e90 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d     p->pageHash =
14ea0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
14eb0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
14ec0 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ll(p);.    }.  }
14ed0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
14ee0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
14ef0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
14f00 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
14f10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
14f20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
14f30 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
14f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
14f50 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65 72  ( MEMDB || pager
14f60 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50  FlushOnCommit(pP
14f70 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20 29  ager, bCommit) )
14f80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14f90 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
14fa0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
14fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14fc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
14fd0 65 61 72 57 72 69 74 61 62 6c 65 28 70 50 61 67  earWritable(pPag
14fe0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
14ff0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
15000 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
15010 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
15020 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
15030 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
15040 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
15050 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  {.    /* Drop th
15060 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b  e WAL write-lock
15070 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20  , if any. Also, 
15080 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
15090 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a  n was in .    **
150a0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
150b0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74  clusive mode but
150c0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64   is no longer, d
150d0 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56  rop the EXCLUSIV
150e0 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68  E .    ** lock h
150f0 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
15100 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
15110 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
15120 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
15130 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
15140 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
15150 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
15160 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OK );.  }else if
15170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15180 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50  && bCommit && pP
15190 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
151a0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
151b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  ){.    /* This b
151c0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
151d0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
151e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
151f0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
15200 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20  .    ** mode if 
15210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15220 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72  e on disk is lar
15230 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
15240 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
15250 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
15260 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  t the journal ha
15270 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
15280 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
15290 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63  tion .    ** suc
152a0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74  cessfully commit
152b0 74 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43  ted, but the EXC
152c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73  LUSIVE lock is s
152d0 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
152e0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f  .    ** file. So
152f0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74   it is safe to t
15300 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
15310 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73  base file to its
15320 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
15330 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20  required size.  
15340 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
15350 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
15360 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
15370 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
15380 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
15390 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
153a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
153b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
153c0 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70  mmit && isOpen(p
153d0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
153e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
153f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
15400 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
15410 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53  CNTL_COMMIT_PHAS
15420 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66  ETWO, 0);.    if
15430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
15440 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c  FOUND ) rc = SQL
15450 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 23 69 66  ITE_OK;.  }..#if
15460 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45  def SQLITE_SERVE
15470 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20  R_EDITION.  if( 
15480 70 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50  pagerIsServer(pP
15490 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 32  ager) ){.    rc2
154a0 20 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65 72   = sqlite3Server
154b0 52 65 6c 65 61 73 65 57 72 69 74 65 4c 6f 63 6b  ReleaseWriteLock
154c0 73 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65  s(pPager->pServe
154d0 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  r);.  }else.#end
154e0 69 66 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  if.  if( !pPager
154f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
15500 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
15510 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
15520 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
15530 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
15540 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
15550 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
15560 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
15570 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15580 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
15590 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
155a0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
155b0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
155c0 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
155d0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
155e0 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
155f0 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
15600 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
15610 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
15620 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
15630 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
15640 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
15650 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
15660 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
15670 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
15680 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
15690 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
156a0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
156b0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
156c0 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
156d0 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
156e0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
156f0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
15700 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
15710 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
15720 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
15730 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
15740 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
15750 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
15760 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
15770 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
15780 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15790 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
157a0 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
157b0 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
157c0 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
157d0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
157e0 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
157f0 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
15800 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
15810 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
15820 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
15830 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
15840 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15850 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
15860 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15870 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
15880 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
15890 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
158a0 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
158b0 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
158c0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
158d0 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
158e0 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
158f0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
15900 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
15910 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
15920 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
15930 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
15940 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15950 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
15960 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
15970 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
15980 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
15990 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
159a0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
159b0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
159c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
159d0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
159e0 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
159f0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15a00 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15a10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15a20 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
15a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15a40 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
15a50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15a60 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
15a70 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
15a80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15a90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
15aa0 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
15ab0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
15ac0 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ion(pPager, 0, 0
15ad0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
15ae0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
15af0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  er);.}../*.** Pa
15b00 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
15b10 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
15b20 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
15b30 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
15b40 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
15b50 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
15b60 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
15b70 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
15b80 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
15b90 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
15ba0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
15bb0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15bc0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
15bd0 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
15be0 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
15bf0 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
15c00 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
15c10 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
15c20 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
15c30 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
15c40 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
15c50 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
15c60 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
15c70 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
15c80 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
15c90 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
15ca0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
15cb0 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
15cc0 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
15cd0 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
15ce0 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
15cf0 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
15d00 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
15d10 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
15d20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
15d30 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
15d40 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
15d50 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
15d60 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
15d70 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
15d80 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
15d90 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
15da0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
15db0 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
15dc0 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
15dd0 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
15de0 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
15df0 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
15e00 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
15e10 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
15e20 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
15e30 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
15e40 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
15e50 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
15e60 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
15e70 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
15e80 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
15e90 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
15ea0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
15eb0 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
15ec0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
15ed0 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
15ee0 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
15ef0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
15f00 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15f10 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
15f20 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
15f30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15f40 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
15f50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15f60 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
15f70 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
15f80 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
15f90 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
15fa0 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
15fb0 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
15fc0 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
15fd0 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
15fe0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
15ff0 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
16000 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
16010 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16020 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
16030 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
16040 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
16050 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
16060 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
16070 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
16080 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
16090 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
160a0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
160d0 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
160e0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
160f0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16100 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
16110 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
16120 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
16130 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
16140 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16150 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16160 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16170 65 73 65 72 76 65 64 20 62 69 74 73 20 69 73 20  eserved bits is 
16180 74 68 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20  the same in the 
16190 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70  destination.** p
161a0 61 67 65 72 20 61 73 20 69 74 20 69 73 20 69 6e  ager as it is in
161b0 20 74 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68   the source.  Th
161c0 69 73 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e  is comes up when
161d0 20 61 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65   a VACUUM change
161e0 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
161f0 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
16200 20 74 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c   to the "optimal
16210 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  " amount..*/.voi
16220 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c  d sqlite3PagerAl
16230 69 67 6e 52 65 73 65 72 76 65 28 50 61 67 65 72  ignReserve(Pager
16240 20 2a 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a   *pDest, Pager *
16250 70 53 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65  pSrc){.  if( pDe
16260 73 74 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53  st->nReserve!=pS
16270 72 63 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a  rc->nReserve ){.
16280 20 20 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65      pDest->nRese
16290 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73  rve = pSrc->nRes
162a0 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
162b0 65 70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29  eportSize(pDest)
162c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
162d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
162e0 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
162f0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
16300 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
16310 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
16320 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
16330 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
16340 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
16350 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
16360 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
16370 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
16380 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
16390 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
163a0 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
163b0 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
163c0 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
163d0 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
163e0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
163f0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
16400 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
16410 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
16420 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
16430 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
16440 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
16450 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
16460 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
16470 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16480 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
16490 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
164a0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
164b0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
164c0 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
164d0 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
164e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
164f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
16500 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
16510 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
16520 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
16530 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
16540 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
16550 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
16560 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
16570 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16580 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
16590 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
165a0 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
165b0 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
165c0 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
165d0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
165e0 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
165f0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
16600 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
16610 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
16620 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
16630 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
16640 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
16650 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
16660 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
16670 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
16680 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
16690 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
166a0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
166b0 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
166c0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
166d0 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
166e0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
166f0 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
16700 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
16710 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16720 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
16730 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
16740 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
16750 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
16760 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16770 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
16780 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
16790 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
167a0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
167b0 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
167c0 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
167d0 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
167e0 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
167f0 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16800 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
16810 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
16820 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
16830 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
16840 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
16850 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
16860 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
16870 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
16880 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
16890 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
168a0 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
168b0 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
168c0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
168d0 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
168e0 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
168f0 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
16900 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
16910 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
16920 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
16930 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
16940 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
16950 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
16960 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
16970 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
16980 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
16990 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
169a0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
169b0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
169c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
169d0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
169e0 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
169f0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
16a00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16a10 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
16a20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
16a30 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
16a40 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16a50 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
16a60 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
16a70 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
16a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
16a90 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
16aa0 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
16ab0 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
16ac0 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
16ad0 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
16ae0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
16af0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
16b00 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
16b30 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16b40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
16b50 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
16b80 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
16b90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
16ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16bb0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16bc0 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
16bd0 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
16be0 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
16c10 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
16c20 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
16c30 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
16c40 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
16c50 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
16c60 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
16c70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
16c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16c90 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
16ca0 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
16cb0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
16cc0 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16ce0 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
16cf0 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
16d00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
16d10 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68  AS_CODEC.  /* Th
16d20 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69  e jrnlEnc flag i
16d30 73 20 74 72 75 65 20 69 66 20 4a 6f 75 72 6e 61  s true if Journa
16d40 6c 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  l pages should b
16d50 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  e passed through
16d60 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e  .  ** the codec.
16d70 20 20 49 74 20 69 73 20 66 61 6c 73 65 20 66 6f    It is false fo
16d80 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79  r pure in-memory
16d90 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
16da0 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e  const int jrnlEn
16db0 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20  c = (isMainJrnl 
16dc0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
16dd0 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e  nMemory==0);.#en
16de0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 28  dif..  assert( (
16df0 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
16e00 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
16e10 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
16e20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
16e30 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
16e40 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
16e50 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
16e60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
16e70 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
16e80 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
16e90 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
16ea0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
16eb0 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
16ec0 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
16ed0 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
16ee0 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
16ef0 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
16f00 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
16f10 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
16f20 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
16f30 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
16f40 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
16f50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
16f60 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
16f70 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
16f80 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
16f90 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
16fa0 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
16fb0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
16fc0 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
16fd0 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
16fe0 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
16ff0 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
17000 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
17010 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
17020 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
17030 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
17040 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
17050 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
17060 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
17070 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
17080 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
17090 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
170a0 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
170b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
170c0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
170d0 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
170e0 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
170f0 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
17100 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
17110 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
17120 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17130 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17140 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
17150 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
17160 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
17170 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
17180 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
17190 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
171a0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
171b0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
171c0 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
171d0 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
171e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
171f0 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
17200 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
17210 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
17220 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
17230 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
17240 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
17250 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
17260 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
17270 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
17280 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
17290 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
172a0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
172b0 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
172c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
172d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
172e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
172f0 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
17300 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17310 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
17320 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
17330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17340 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
17350 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
17360 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
17370 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
17380 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
17390 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
173a0 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
173b0 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
173c0 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
173d0 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
173e0 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
173f0 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
17400 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
17410 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
17420 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
17430 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
17440 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
17450 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
17460 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
17470 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
17480 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
17490 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
174a0 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
174b0 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
174c0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
174d0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
174e0 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
174f0 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
17500 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
17510 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
17520 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
17530 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
17540 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
17550 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
17560 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17570 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
17580 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
17590 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
175a0 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
175b0 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
175c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
175d0 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
175e0 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
175f0 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
17600 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
17610 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17620 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
17630 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
17640 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
17650 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
17660 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
17670 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
17680 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
17690 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
176a0 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
176b0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
176c0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
176d0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
176e0 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
176f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17700 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
17710 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
17720 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
17730 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
17740 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
17750 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
17760 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17770 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
17780 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
17790 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
177a0 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
177b0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
177c0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
177d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
177e0 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
177f0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
17800 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
17810 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
17820 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
17830 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
17840 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
17850 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
17860 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
17870 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
17880 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
17890 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
178a0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
178b0 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
178c0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
178d0 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
178e0 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
178f0 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
17900 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
17910 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
17920 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
17930 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
17940 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
17950 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
17960 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
17970 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
17980 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
17990 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
179a0 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
179b0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
179c0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
179d0 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
179e0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
179f0 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
17a00 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
17a10 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
17a20 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
17a30 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
17a40 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
17a50 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
17a60 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
17a70 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
17a80 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
17a90 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
17aa0 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
17ab0 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
17ac0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
17ad0 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
17ae0 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
17af0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
17b00 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
17b10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17b20 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
17b30 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
17b40 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
17b50 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
17b60 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
17b70 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
17b80 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
17b90 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
17ba0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
17bb0 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
17bc0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
17bd0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
17be0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
17bf0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17c00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
17c10 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
17c20 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
17c30 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
17c40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
17c50 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
17c60 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
17c70 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
17c80 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
17c90 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
17ca0 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
17cb0 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
17cc0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
17cd0 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
17ce0 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
17cf0 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
17d00 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
17d10 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
17d20 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
17d30 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
17d40 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
17d50 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
17d60 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
17d70 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
17d80 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
17d90 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
17da0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
17db0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
17dc0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
17dd0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
17de0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
17df0 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
17e00 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
17e10 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
17e20 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
17e30 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
17e40 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
17e50 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
17e60 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
17e70 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
17e80 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
17e90 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
17ea0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
17eb0 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
17ec0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
17ed0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
17ee0 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
17ef0 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
17f00 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
17f10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
17f20 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
17f30 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
17f40 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
17f50 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
17f60 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
17f70 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
17f80 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
17f90 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
17fa0 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
17fb0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
17fc0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
17fd0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
17fe0 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
17ff0 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
18000 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
18010 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
18020 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
18030 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
18040 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
18050 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
18060 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
18070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18080 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
18090 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
180a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
180b0 46 69 6c 65 20 29 3b 0a 20 20 50 41 47 45 52 54  File );.  PAGERT
180c0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
180d0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
180e0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
180f0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
18100 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
18110 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
18120 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18130 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
18140 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
18150 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
18160 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
18170 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
18180 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
18190 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
181a0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
181b0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
181c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
181d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
181e0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
181f0 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
18200 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
18210 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
18220 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18230 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
18240 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
18250 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
18260 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
18270 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
18280 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
18290 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
182a0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
182b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
182c0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
182d0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
182e0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
182f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
18300 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
18310 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
18320 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
18330 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 61   /* Write the da
18340 74 61 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ta read from the
18350 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e   journal back in
18360 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18370 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69  file..    ** Thi
18380 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66  s is usually saf
18390 65 20 65 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e  e even for an en
183a0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
183b0 20 2d 20 61 73 20 74 68 65 20 64 61 74 61 0a 20   - as the data. 
183c0 20 20 20 2a 2a 20 77 61 73 20 65 6e 63 72 79 70     ** was encryp
183d0 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 77 61  ted before it wa
183e0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
183f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18400 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  he exception.   
18410 20 2a 2a 20 69 73 20 69 66 20 74 68 65 20 64 61   ** is if the da
18420 74 61 20 77 61 73 20 6a 75 73 74 20 72 65 61 64  ta was just read
18430 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f   from an in-memo
18440 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ry sub-journal. 
18450 49 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  In that.    ** c
18460 61 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 65  ase it must be e
18470 6e 63 72 79 70 74 65 64 20 68 65 72 65 20 62 65  ncrypted here be
18480 66 6f 72 65 20 69 74 20 69 73 20 63 6f 70 69 65  fore it is copie
18490 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  d into the datab
184a0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ase.    ** file.
184b0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
184c0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
184d0 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b   if( !jrnlEnc ){
184e0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
184f0 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
18500 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
18510 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74  NOMEM_BKPT, aDat
18520 61 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  a);.      rc = s
18530 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
18540 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29  ager->fd, (u8 *)
18550 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
18560 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
18570 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18580 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18590 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
185a0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
185b0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
185c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
185d0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
185e0 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
185f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18600 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  ofst);..    if( 
18610 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
18620 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
18630 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
18640 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
18650 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
18660 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 23 69 66  ->pBackup ){.#if
18670 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
18680 4f 44 45 43 0a 20 20 20 20 20 20 69 66 28 20 6a  ODEC.      if( j
18690 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20 20  rnlEnc ){.      
186a0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
186b0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
186c0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
186d0 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 20 20  _BKPT);.        
186e0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
186f0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
18700 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
18710 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
18720 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
18730 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
18740 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
18750 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20 20 20 20  KPT,aData);.    
18760 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
18770 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
18780 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
18790 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
187a0 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
187b0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
187c0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
187d0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
187e0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
187f0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
18800 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
18810 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
18820 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
18830 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
18840 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
18850 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
18860 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
18870 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
18880 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
18890 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
188a0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
188b0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
188c0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
188d0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
188e0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
188f0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
18900 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
18910 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
18920 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
18930 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
18940 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
18950 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
18960 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
18970 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
18980 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
18990 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
189a0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
189b0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
189c0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
189d0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
189e0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
189f0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
18a00 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
18a10 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
18a20 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
18a30 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
18a40 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
18a50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
18a60 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
18a70 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
18a80 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
18a90 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
18aa0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
18ab0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
18ac0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
18ad0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
18ae0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
18af0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
18b00 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
18b10 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
18b20 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
18b30 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
18b40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
18b50 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
18b60 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
18b70 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
18b80 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18b90 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
18ba0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
18bb0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
18bc0 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
18bd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
18be0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
18bf0 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
18c00 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
18c10 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
18c20 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
18c30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
18c40 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
18c50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18c60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18c70 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
18c80 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
18c90 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
18ca0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
18cb0 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
18cc0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
18cd0 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
18ce0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
18cf0 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
18d00 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
18d10 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
18d20 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
18d30 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
18d40 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
18d50 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
18d60 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
18d70 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
18d80 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
18d90 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
18da0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
18db0 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
18dc0 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
18dd0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
18de0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
18df0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
18e00 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
18e10 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
18e20 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
18e30 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
18e40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18e50 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
18e60 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
18e70 20 20 20 20 2f 2a 20 49 74 20 75 73 65 64 20 74      /* It used t
18e80 6f 20 62 65 20 74 68 61 74 20 73 71 6c 69 74 65  o be that sqlite
18e90 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
18ea0 28 70 50 67 29 20 77 61 73 20 63 61 6c 6c 65 64  (pPg) was called
18eb0 20 68 65 72 65 2e 20 20 42 75 74 0a 20 20 20 20   here.  But.    
18ec0 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20 77 61 73  ** that call was
18ed0 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 68   dangerous and h
18ee0 61 64 20 6e 6f 20 64 65 74 65 63 74 61 62 6c 65  ad no detectable
18ef0 20 62 65 6e 65 66 69 74 20 73 69 6e 63 65 20 74   benefit since t
18f00 68 65 20 63 61 63 68 65 0a 20 20 20 20 2a 2a 20  he cache.    ** 
18f10 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61  is normally clea
18f20 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
18f30 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61  acheCleanAll() a
18f40 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  fter rollback an
18f50 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20  d so.    ** has 
18f60 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  been removed. */
18f70 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
18f80 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20  agehash(pPg);.. 
18f90 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
18fa0 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
18fb0 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
18fc0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
18fd0 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
18fe0 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
18ff0 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
19000 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
19010 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
19020 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
19030 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
19040 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
19050 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
19060 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
19070 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
19080 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
19090 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  sk */.#if SQLITE
190a0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69  _HAS_CODEC.    i
190b0 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f  f( jrnlEnc ){ CO
190c0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
190d0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
190e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
190f0 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69  M_BKPT); }.#endi
19100 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  f.    sqlite3Pca
19110 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
19120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
19140 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
19150 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
19160 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19170 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
19180 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
19190 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
191a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
191b0 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
191c0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
191d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
191e0 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
191f0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
19200 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
19210 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
19220 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
19230 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
19240 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
19250 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
19260 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
19270 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
19280 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
19290 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
192a0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
192b0 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
192c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
192d0 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
192e0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
192f0 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
19300 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
19310 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
19320 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
19330 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
19340 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
19350 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
19360 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
19370 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
19380 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
19390 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
193a0 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
193b0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
193c0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
193d0 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
193e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
193f0 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
19400 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
19410 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
19420 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
19430 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
19440 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
19450 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
19460 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
19470 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
19480 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
19490 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
194a0 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
194b0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
194c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
194d0 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
194e0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
194f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
19500 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
19510 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
19520 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
19530 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
19540 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
19550 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
19560 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
19570 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
19580 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
19590 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
195a0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
195b0 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
195c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
195d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
195e0 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
195f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
19600 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
19610 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
19620 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
19630 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
19640 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
19650 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
19660 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
19670 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
19680 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
19690 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
196a0 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
196b0 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
196c0 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
196d0 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
196e0 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
196f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
19700 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
19710 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
19720 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
19730 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
19740 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
19750 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
19760 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
19770 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
19780 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
19790 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
197a0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
197b0 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
197c0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
197d0 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
197e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
197f0 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
19800 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19810 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
19820 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
19830 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
19840 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
19850 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19860 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
19870 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
19880 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
19890 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
198a0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
198b0 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
198c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
198d0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
198e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
198f0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
19900 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
19910 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
19920 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
19930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19940 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
19950 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
19960 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
19970 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
19980 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
19990 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
199a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
199b0 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
199c0 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
199d0 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
199e0 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
199f0 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
19a00 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
19a10 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
19a20 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
19a30 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
19a40 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19a50 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
19a60 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
19a70 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
19a80 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
19a90 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
19aa0 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
19ab0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
19ac0 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
19ad0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
19ae0 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
19af0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
19b00 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
19b10 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
19b20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
19b30 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
19b40 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
19b50 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
19b60 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
19b70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
19b80 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
19b90 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
19ba0 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
19bb0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19bc0 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
19bd0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
19be0 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
19bf0 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
19c00 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
19c10 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
19c20 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
19c30 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
19c40 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
19c50 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
19c60 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
19c70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19c80 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  OMEM_BKPT;.  }el
19c90 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
19ca0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
19cb0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
19cc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
19cd0 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
19ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
19cf0 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
19d00 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
19d10 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
19d20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19d30 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19d40 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
19d50 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
19d60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
19d70 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
19d80 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
19d90 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
19da0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
19db0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
19dc0 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
19dd0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
19de0 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
19df0 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
19e00 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
19e10 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
19e20 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
19e30 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
19e40 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
19e50 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
19e60 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
19e70 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
19e80 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
19e90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19ea0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19eb0 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
19ec0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
19ed0 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
19ee0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
19ef0 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
19f00 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
19f10 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
19f20 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
19f30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19f40 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67  OMEM_BKPT;.    g
19f50 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19f60 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  t;.  }.  zMaster
19f70 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
19f80 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
19f90 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20  rnal+1];.  rc = 
19fa0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
19fb0 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
19fc0 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
19fd0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
19fe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19ff0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a000 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73  ster_out;.  zMas
1a010 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
1a020 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
1a030 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d  .  zJournal = zM
1a040 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
1a050 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
1a060 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
1a070 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
1a080 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  ){.    int exist
1a090 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
1a0a0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a0b0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
1a0c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1a0d0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
1a0e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a0f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1a100 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a110 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69     }.    if( exi
1a120 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sts ){.      /* 
1a130 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
1a140 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
1a150 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
1a160 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
1a170 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
1a180 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
1a190 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
1a1a0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
1a1b0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
1a1c0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
1a1d0 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
1a1e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
1a1f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1a200 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  c;.      int fla
1a210 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
1a220 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
1a230 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1a240 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  NAL);.      rc =
1a250 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1a260 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
1a270 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
1a280 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1a290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a2a0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a2b0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a2c0 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72   }..      rc = r
1a2d0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1a2e0 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
1a2f0 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
1a300 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
1a310 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
1a320 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
1a330 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a340 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a350 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a360 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d   }..      c = zM
1a370 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
1a380 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
1a390 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
1a3a0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b  ;.      if( c ){
1a3b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  .        /* We h
1a3c0 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
1a3d0 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
1a3e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a3f0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  le. */.        g
1a400 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a410 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1a420 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d  .    zJournal +=
1a430 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
1a440 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
1a450 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f    }. .  sqlite3O
1a460 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
1a470 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a480 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
1a490 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
1a4a0 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  aster_out:.  sql
1a4b0 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
1a4c0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
1a4d0 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
1a4e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1a4f0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
1a500 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
1a510 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71  urnal) );.    sq
1a520 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
1a530 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1a540 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1a550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a560 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
1a570 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
1a580 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a590 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
1a5a0 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
1a5b0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
1a5c0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
1a5d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
1a5e0 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
1a5f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
1a600 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
1a610 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
1a620 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
1a630 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1a640 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
1a650 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72  en, or the pager
1a660 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65   is not in eithe
1a670 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50  r.** DBMOD or OP
1a680 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  EN state, this f
1a690 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1a6a0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1a6b0 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74  he size .** of t
1a6c0 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67  he file is chang
1a6d0 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
1a6e0 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
1a6f0 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
1a700 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  . .** If the fil
1a710 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  e on disk is cur
1a720 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
1a730 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
1a740 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
1a750 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
1a760 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
1a770 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
1a780 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
1a790 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
1a7a0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
1a7b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
1a7c0 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
1a7d0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1a7e0 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
1a7f0 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
1a800 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
1a810 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
1a820 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
1a830 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
1a840 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
1a850 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
1a860 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
1a870 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
1a880 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
1a890 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
1a8a0 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
1a8b0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
1a8c0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
1a8d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1a8e0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1a8f0 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
1a900 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
1a910 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
1a920 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
1a930 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1a940 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1a950 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
1a960 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
1a970 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1a980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1a990 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1a9a0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
1a9b0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
1a9c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
1a9d0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
1a9e0 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
1a9f0 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
1aa00 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1aa10 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1aa20 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1aa30 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1aa40 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
1aa50 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
1aa60 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
1aa70 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
1aa80 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1aa90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1aaa0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
1aab0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
1aac0 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
1aad0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
1aae0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
1aaf0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1ab00 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1ab10 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
1ab20 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
1ab30 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
1ab40 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
1ab50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ab60 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
1ab70 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1ab80 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
1ab90 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1aba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1abb0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
1abc0 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
1abd0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1abe0 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50  (currentSize+szP
1abf0 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b  age)<=newSize ){
1ac00 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1ac10 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
1ac20 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
1ac30 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
1ac40 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
1ac50 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
1ac60 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
1ac70 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
1ac80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ac90 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1aca0 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
1acb0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1acc0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1acd0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
1ace0 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
1acf0 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
1ad00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1ad10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ad20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1ad30 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
1ad40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ad50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ad60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ad70 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72   a sanitized ver
1ad80 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74  sion of the sect
1ad90 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69  or-size of OS fi
1ada0 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a  le pFile. The.**
1adb0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1adc0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
1add0 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e  ie between 32 an
1ade0 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  d MAX_SECTOR_SIZ
1adf0 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
1ae00 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  3SectorSize(sqli
1ae10 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
1ae20 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73  {.  int iRet = s
1ae30 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
1ae40 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ze(pFile);.  if(
1ae50 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20   iRet<32 ){.    
1ae60 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65  iRet = 512;.  }e
1ae70 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58  lse if( iRet>MAX
1ae80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
1ae90 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
1aea0 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
1aeb0 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d   );.    iRet = M
1aec0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
1aed0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1aee0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
1aef0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1af00 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1af10 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
1af20 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
1af30 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
1af40 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1af50 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1af60 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
1af70 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1af80 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
1af90 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
1afa0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
1afb0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
1afc0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
1afd0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
1afe0 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
1aff0 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
1b000 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
1b010 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
1b020 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
1b030 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
1b040 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1b050 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
1b060 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
1b070 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
1b080 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
1b090 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1b0a0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
1b0b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1b0c0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1b0d0 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
1b0e0 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
1b0f0 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
1b100 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
1b110 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
1b120 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
1b130 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
1b140 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
1b150 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  IZE..**.** If th
1b160 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53  e file has the S
1b170 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1b180 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1b190 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73  property, then s
1b1a0 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  et.** the effect
1b1b0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1b1c0 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76  to its minimum v
1b1d0 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65  alue (512).  The
1b1e0 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70   purpose of.** p
1b1f0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1b200 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74  e is to define t
1b210 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73  he "blast radius
1b220 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a  " of bytes that.
1b230 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1b240 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  if a crash occur
1b250 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  s while writing 
1b260 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  to a single byte
1b270 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67   in.** that rang
1b280 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57  e.  But with POW
1b290 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1b2a0 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69  , the blast radi
1b2b0 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74  us is zero.** (t
1b2c0 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45  hat is what POWE
1b2d0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1b2e0 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69  means), so we mi
1b2f0 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f  nimize the secto
1b300 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20  r.** size.  For 
1b310 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
1b320 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72  ibility of the r
1b330 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1b340 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20  file format,.** 
1b350 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65  we cannot reduce
1b360 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b370 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77  ector size below
1b380 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
1b390 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
1b3a0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1b3b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
1b3c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1b3d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1b3e0 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ile );..  if( pP
1b3f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1b400 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
1b410 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1b420 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1b430 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   & .            
1b440 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50    SQLITE_IOCAP_P
1b450 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b460 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  TE)!=0.  ){.    
1b470 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
1b480 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
1b490 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1b4a0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
1b4b0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
1b4c0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1b4d0 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
1b4e0 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
1b4f0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
1b500 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
1b510 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  t. */.    pPager
1b520 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
1b530 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  12;.  }else{.   
1b540 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1b550 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63  ize = sqlite3Sec
1b560 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
1b570 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fd);.  }.}../*.*
1b580 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
1b590 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
1b5a0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1b5b0 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
1b5c0 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1b5d0 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
1b5e0 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
1b5f0 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
1b600 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1b610 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
1b620 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
1b630 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
1b640 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
1b650 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
1b660 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
1b670 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1b680 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1b690 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
1b6a0 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
1b6b0 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
1b6c0 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
1b6d0 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
1b6e0 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
1b6f0 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
1b700 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
1b710 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
1b720 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
1b730 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b740 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b750 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
1b760 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
1b770 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
1b780 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
1b790 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
1b7a0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1b7b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1b7c0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
1b7d0 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
1b7e0 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
1b7f0 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
1b800 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1b810 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1b820 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
1b830 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
1b840 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
1b850 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
1b860 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
1b870 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b880 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b890 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
1b8a0 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
1b8b0 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
1b8c0 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
1b8d0 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
1b8e0 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
1b8f0 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
1b900 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
1b910 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
1b920 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
1b930 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
1b940 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
1b950 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
1b960 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
1b970 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
1b980 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
1b990 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
1b9a0 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
1b9b0 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
1b9c0 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
1b9d0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
1b9e0 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1b9f0 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
1ba00 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
1ba10 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
1ba20 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
1ba30 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
1ba40 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
1ba50 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
1ba60 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1ba70 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
1ba80 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
1ba90 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1baa0 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
1bab0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bac0 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
1bad0 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
1bae0 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
1baf0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
1bb00 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
1bb10 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
1bb20 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
1bb30 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1bb40 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
1bb50 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1bb60 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
1bb70 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
1bb80 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
1bb90 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
1bba0 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
1bbb0 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
1bbc0 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
1bbd0 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
1bbe0 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
1bbf0 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
1bc00 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
1bc10 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
1bc20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
1bc30 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1bc40 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
1bc50 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
1bc60 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
1bc70 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
1bc80 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
1bc90 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
1bca0 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
1bcb0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
1bcc0 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
1bcd0 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
1bce0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1bcf0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1bd00 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
1bd10 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
1bd20 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
1bd30 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
1bd40 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
1bd50 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
1bd60 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1bd70 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
1bd80 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
1bd90 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
1bda0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
1bdb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1bdc0 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
1bdd0 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
1bde0 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
1bdf0 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
1be00 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
1be10 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
1be20 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
1be30 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
1be40 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
1be50 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
1be60 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
1be70 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
1be80 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1be90 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
1bea0 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
1beb0 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
1bec0 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
1bed0 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
1bee0 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
1bef0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
1bf00 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
1bf10 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
1bf20 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1bf30 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
1bf40 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
1bf50 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
1bf60 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
1bf70 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
1bf80 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
1bf90 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
1bfa0 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
1bfb0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
1bfc0 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
1bfd0 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
1bfe0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
1bff0 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
1c000 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
1c010 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
1c020 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
1c030 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
1c040 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
1c050 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
1c060 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
1c070 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
1c080 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
1c090 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
1c0a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c0b0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1c0c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1c0d0 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
1c0e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1c0f0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1c100 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
1c110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c120 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1c130 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1c140 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c160 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
1c170 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1c180 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1a0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1c1b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
1c1c0 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
1c1d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c1e0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
1c1f0 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
1c200 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1c210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1c220 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
1c230 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1c240 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
1c250 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1c260 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1c270 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
1c280 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
1c290 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1c2a0 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
1c2b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
1c2c0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
1c2d0 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
1c2e0 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
1c2f0 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
1c300 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
1c310 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61  ck */.  int nPla
1c320 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  yback = 0;      
1c330 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1c340 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72   of pages restor
1c350 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ed from journal 
1c360 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
1c370 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
1c380 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
1c390 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
1c3a0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
1c3b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
1c3c0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
1c3d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1c3e0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
1c3f0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1c400 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1c410 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
1c420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c430 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c440 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
1c450 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
1c460 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
1c470 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
1c480 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
1c490 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
1c4a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1c4b0 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
1c4c0 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
1c4d0 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
1c4e0 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
1c4f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
1c500 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
1c510 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
1c520 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
1c530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
1c540 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
1c550 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
1c560 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
1c570 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
1c580 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
1c590 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
1c5a0 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
1c5b0 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
1c5c0 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
1c5d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
1c5e0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
1c5f0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
1c600 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
1c610 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20    ** mxPathname 
1c620 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1c630 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1c640 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1c650 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1c660 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1c670 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1c680 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1c690 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1c6a0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1c6b0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1c6c0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1c6d0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1c6e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c6f0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1c700 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c710 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1c720 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1c730 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1c740 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1c750 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1c760 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1c770 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1c780 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c790 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1c7a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1c7b0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1c7c0 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1c7d0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1c7e0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1c7f0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1c800 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1c810 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1c820 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1c830 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1c840 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1c850 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1c860 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1c870 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1c880 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1c890 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1c8a0 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1c8b0 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1c8c0 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1c8d0 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1c8e0 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1c8f0 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1c900 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1c910 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1c920 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1c930 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1c940 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1c950 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1c960 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1c970 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1c980 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1c990 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1c9a0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1c9b0 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1c9c0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1c9d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c9e0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1c9f0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1ca00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ca10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1ca20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1ca30 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1ca40 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1ca50 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1ca60 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1ca70 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1ca80 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1ca90 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1caa0 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1cab0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1cac0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1cad0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1cae0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1caf0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1cb00 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1cb10 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1cb20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1cb30 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1cb40 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1cb50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1cb60 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1cb70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1cb80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cb90 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1cba0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1cbb0 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1cbc0 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1cbd0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1cbe0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1cbf0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1cc00 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1cc10 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1cc20 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1cc30 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1cc40 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1cc50 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1cc60 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1cc70 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1cc80 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1cc90 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1cca0 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1ccb0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1ccc0 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1ccd0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1cce0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1ccf0 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1cd00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1cd10 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1cd20 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1cd30 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1cd40 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1cd50 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1cd60 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1cd70 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1cd80 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1cd90 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1cda0 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1cdb0 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1cdc0 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1cdd0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1cde0 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1cdf0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1ce00 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1ce10 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1ce20 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1ce30 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1ce40 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1ce50 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1ce60 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1ce70 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1ce80 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1ce90 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1cea0 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1ceb0 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1cec0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1ced0 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1cee0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1cef0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1cf00 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1cf10 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1cf20 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1cf30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1cf40 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1cf50 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1cf60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1cf70 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1cf80 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1cf90 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1cfa0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1cfb0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1cfc0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1cfd0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1cfe0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1cff0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1d000 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1d010 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1d020 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1d030 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1d040 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1d050 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1d060 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d070 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1d080 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1d090 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1d0a0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d0b0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1d0c0 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1d0d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1d0f0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1d100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1d110 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1d120 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1d130 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1d140 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1d150 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1d160 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1d170 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1d180 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1d190 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1d1a0 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1d1b0 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1d1c0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1d1d0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1d1e0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1d1f0 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1d200 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1d210 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1d220 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1d230 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1d240 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d250 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1d260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d270 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61   ){.        nPla
1d280 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d  yback++;.      }
1d290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1d2a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1d2b0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  E ){.          p
1d2c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d2d0 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1d2e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d2f0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1d300 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1d310 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1d320 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1d330 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1d340 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1d350 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1d360 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1d370 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1d380 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1d390 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1d3a0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1d3b0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1d3c0 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1d3d0 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1d3e0 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1d3f0 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1d400 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1d410 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1d420 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1d430 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1d440 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1d450 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1d460 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1d470 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1d480 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1d490 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d4a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1d4b0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1d4c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d4d0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1d4e0 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1d4f0 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1d500 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1d510 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1d520 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1d530 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1d540 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1d550 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1d560 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1d570 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1d580 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1d590 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1d5a0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1d5b0 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1d5c0 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1d5d0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1d5e0 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1d5f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1d600 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1d610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d620 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1d630 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1d640 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1d650 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
1d660 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1d670 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1d680 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1d690 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1d6a0 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1d6b0 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1d6c0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1d6d0 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1d6e0 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1d6f0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1d700 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1d710 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1d720 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1d730 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1d740 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1d750 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1d760 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  d..  */.#ifdef S
1d770 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1d780 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
1d790 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71  ethods ){.    sq
1d7a0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1d7b0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
1d7c0 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1d7d0 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a  B_UNCHANGED,0);.
1d7e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1d7f0 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
1d800 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
1d810 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
1d820 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
1d830 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
1d840 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
1d850 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
1d860 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
1d870 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
1d880 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
1d890 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1d8a0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1d8b0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1d8c0 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
1d8d0 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
1d8e0 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
1d8f0 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
1d900 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
1d910 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
1d920 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
1d930 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
1d940 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
1d950 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
1d960 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
1d970 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1d980 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
1d990 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
1d9a0 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
1d9b0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
1d9c0 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
1d9d0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
1d9e0 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
1d9f0 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
1da00 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
1da10 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
1da20 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
1da30 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
1da40 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1da50 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1da60 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1da70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1da80 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
1da90 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1daa0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
1dab0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1dac0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1dad0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1dae0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1daf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1db00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1db10 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1db20 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50  ITE_OK.   && (pP
1db30 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1db40 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1db50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1db60 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
1db70 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
1db80 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1db90 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
1dba0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dbb0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1dbc0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1dbd0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
1dbe0 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30  ster[0]!='\0', 0
1dbf0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1dc00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dc10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1dc20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1dc30 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
1dc40 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1dc50 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
1dc60 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
1dc70 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1dc80 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
1dc90 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1dca0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
1dcb0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
1dcc0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
1dcd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
1dce0 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
1dcf0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
1dd00 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1dd10 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1dd20 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61  f( isHot && nPla
1dd30 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  yback ){.    sql
1dd40 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1dd50 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
1dd60 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65  OLLBACK, "recove
1dd70 72 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f  red %d pages fro
1dd80 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  m %s",.         
1dd90 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1dda0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1ddb0 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  al);.  }..  /* T
1ddc0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1ddd0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
1dde0 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
1ddf0 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
1de00 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
1de10 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
1de20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
1de30 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
1de40 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
1de50 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
1de60 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1de70 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
1de80 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
1de90 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1dea0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1deb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1dec0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
1ded0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1dee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1def0 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
1df00 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
1df10 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
1df20 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
1df30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1df40 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
1df50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1df60 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
1df70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
1df80 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1df90 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1dfa0 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
1dfb0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
1dfc0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1dfd0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1dfe0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1dff0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
1e000 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e010 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1e020 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1e030 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e040 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1e050 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1e060 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20  PgHdr *pPg, u32 
1e070 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72  iFrame){.  Pager
1e080 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1e090 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
1e0a0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1e0b0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
1e0c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
1e0d0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
1e0e0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1e0f0 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
1e100 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e110 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
1e120 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e130 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65  int pgsz = pPage
1e140 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20  r->pageSize; /* 
1e150 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1e160 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  to read */..  as
1e170 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e180 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
1e190 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ER && !MEMDB );.
1e1a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1e1b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
1e1c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e1d0 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69  OMIT_WAL.  if( i
1e1e0 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Frame ){.    /* 
1e1f0 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
1e200 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
1e210 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
1e220 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1e230 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70  e3WalReadFrame(p
1e240 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72  Pager->pWal, iFr
1e250 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e  ame, pgsz, pPg->
1e260 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a  pData);.  }else.
1e270 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
1e280 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67  64 iOffset = (pg
1e290 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1e2a0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1e2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1e2c0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1e2d0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a  pPg->pData, pgsz
1e2e0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
1e2f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1e300 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1e310 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1e320 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e330 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   }..  if( pgno==
1e340 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
1e350 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1e360 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
1e370 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1e380 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
1e390 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
1e3a0 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
1e3b0 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
1e3c0 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
1e3d0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
1e3e0 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
1e3f0 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
1e400 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1e410 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
1e420 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
1e430 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
1e440 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1e450 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
1e460 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
1e470 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
1e480 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
1e490 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1e4a0 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
1e4b0 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
1e4c0 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
1e4d0 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
1e4e0 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
1e4f0 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
1e500 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1e510 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
1e520 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
1e530 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
1e540 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
1e550 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
1e560 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1e570 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
1e580 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
1e590 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
1e5a0 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
1e5b0 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ise equaling 16 
1e5c0 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
1e5d0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1e5e0 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
1e5f0 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
1e600 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
1e610 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
1e620 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1e630 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
1e640 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1e650 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e660 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
1e670 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
1e680 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
1e690 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1e6a0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1e6b0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1e6c0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1e6d0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
1e6e0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1e6f0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
1e700 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
1e710 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
1e720 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1e730 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1e740 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1e750 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1e760 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1e770 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1e780 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1e790 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1e7a0 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1e7b0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1e7c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1e7d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1e7e0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1e7f0 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1e800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e810 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1e820 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1e830 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1e840 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1e850 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1e860 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1e870 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1e880 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1e890 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1e8a0 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1e8b0 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1e8c0 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1e8d0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1e8e0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1e8f0 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1e900 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1e910 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1e920 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1e930 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1e940 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1e950 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1e960 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1e970 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1e980 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1e990 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1e9a0 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1e9b0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1e9c0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1e9d0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1e9e0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1e9f0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1ea00 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1ea10 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1ea20 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1ea30 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1ea40 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1ea50 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1ea60 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1ea70 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1ea80 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1ea90 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1eaa0 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1eab0 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1eac0 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1ead0 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1eae0 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1eaf0 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1eb00 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1eb10 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1eb20 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1eb30 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1eb40 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1eb50 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1eb60 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1eb70 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1eb80 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1eb90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1eba0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1ebb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1ebc0 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1ebd0 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1ebe0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1ebf0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1ec00 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1ec10 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1ec20 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1ec30 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1ec40 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1ec50 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1ec60 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1ec70 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1ec80 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1ec90 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1eca0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1ecb0 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1ecc0 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1ecd0 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1ece0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1ecf0 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1ed00 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1ed10 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1ed20 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1ed30 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1ed40 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1ed50 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1ed60 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1ed70 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1ed80 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1ed90 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1eda0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1edb0 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1edc0 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1edd0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ede0 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1edf0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1ee00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ee10 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1ee20 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1ee30 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ee40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1ee50 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1ee60 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1ee70 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
1ee80 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1ee90 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67  pPager) );.  pPg
1eea0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
1eeb0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
1eec0 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
1eed0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1eee0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
1eef0 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
1ef00 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1ef10 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
1ef20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
1ef30 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20   iFrame = 0;.   
1ef40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1ef50 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
1ef60 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70  er->pWal, pPg->p
1ef70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
1ef80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ef90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1efa0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1efb0 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
1efc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1efd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1efe0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1eff0 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1f000 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f010 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f020 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
1f030 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f040 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74  Normally, if a t
1f050 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1f060 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62  lled back, any b
1f070 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1f080 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  are.  ** updated
1f090 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69   as data is copi
1f0a0 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f  ed out of the ro
1f0b0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1f0c0 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nd into the.  **
1f0d0 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
1f0e0 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79  is not generally
1f0f0 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61   possible with a
1f100 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61   WAL database, a
1f110 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  s.  ** rollback 
1f120 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20  involves simply 
1f130 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c  truncating the l
1f140 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f  og file. Therefo
1f150 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  re, if one.  ** 
1f160 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68  or more frames h
1f170 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1f180 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1f190 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f  log (and therefo
1f1a0 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f  re .  ** also co
1f1b0 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61  pied into the ba
1f1c0 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20  ckup databases) 
1f1d0 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1f1e0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a  transaction,.  *
1f1f0 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75  * the backups mu
1f200 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  st be restarted.
1f210 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
1f220 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
1f230 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a  ger->pBackup);..
1f240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f250 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f260 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1f270 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   rollback a tran
1f280 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c  saction on a WAL
1f290 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1f2a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f  atic int pagerRo
1f2b0 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20  llbackWal(Pager 
1f2c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f2d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f2f0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1f300 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20  PgHdr *pList;   
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79  /* List of dirty
1f330 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74   pages to revert
1f340 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c   */..  /* For al
1f350 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  l pages in the c
1f360 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75  ache that are cu
1f370 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72  rrently dirty or
1f380 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
1f390 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1f3a0 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74  (but not committ
1f3b0 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ed) to the log f
1f3c0 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74  ile, do one of t
1f3d0 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  he .  ** followi
1f3e0 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
1f3f0 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  + Discard the ca
1f400 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65  ched page (if re
1f410 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20  fcount==0), or. 
1f420 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70   **   + Reload p
1f430 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  age content from
1f440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
1f450 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20  f refcount>0).. 
1f460 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
1f470 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1f480 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20  bOrigSize;.  rc 
1f490 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f  = sqlite3WalUndo
1f4a0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1f4b0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1f4c0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1f4d0 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
1f4e0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1f4f0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1f500 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  che);.  while( p
1f510 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1f520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1f530 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1f540 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1f550 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1f560 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1f570 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1f580 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1f590 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1f5a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f5b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f5c0 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1f5d0 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1f5e0 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1f5f0 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1f600 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1f610 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1f620 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1f630 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1f640 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1f650 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1f660 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1f670 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1f680 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1f690 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1f6a0 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1f6b0 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1f6c0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1f6d0 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
1f6e0 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1f6f0 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
1f700 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
1f710 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
1f720 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
1f730 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
1f740 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f750 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1f760 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f780 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1f790 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7b0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1f7c0 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1f7d0 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1f800 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1f810 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1f820 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1f830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f840 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1f850 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
1f860 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f880 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1f890 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1f8c0 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a  ges in pList */.
1f8d0 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1f900 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a   over pages */..
1f910 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f920 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
1f930 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
1f940 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f950 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1f960 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
1f970 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
1f980 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
1f990 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
1f9a0 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
1f9b0 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
1f9c0 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
1f9d0 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
1f9e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1f9f0 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72  ert( pList->pDir
1fa00 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69  ty==0 || isCommi
1fa10 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d  t );.  if( isCom
1fa20 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mit ){.    /* If
1fa30 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1fa40 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  on is being comm
1fa50 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  itted, there is 
1fa60 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
1fa70 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70  ing.    ** any p
1fa80 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e  ages with page n
1fa90 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
1faa0 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e  han nTruncate in
1fab0 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  to the WAL file.
1fac0 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c  .    ** They wil
1fad0 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  l never be read 
1fae0 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53  by any client. S
1faf0 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  o remove them fr
1fb00 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20  om the pDirty.  
1fb10 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20    ** list here. 
1fb20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  */.    PgHdr **p
1fb30 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1fb40 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
1fb50 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1fb60 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1fb70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1fb80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1fb90 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1fba0 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1fbb0 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1fbc0 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1fbd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fbe0 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1fbf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1fc00 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1fc10 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1fc20 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1fc30 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1fc40 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1fc50 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1fc60 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1fc70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1fc80 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1fc90 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1fca0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fcb0 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1fcc0 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1fcd0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1fce0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1fcf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1fd00 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1fd10 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  {.    for(p=pLis
1fd20 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1fd30 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1fd40 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1fd50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1fd60 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1fd70 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1fd80 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1fd90 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1fda0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1fdb0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1fdc0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1fdd0 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1fde0 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1fdf0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1fe00 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1fe10 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1fe20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1fe30 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1fe40 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1fe50 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1fe60 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1fe70 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1fe80 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1fe90 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1fea0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
1feb0 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
1fec0 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
1fed0 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
1fee0 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
1fef0 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
1ff00 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
1ff10 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
1ff20 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
1ff30 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
1ff40 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
1ff50 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
1ff60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ff70 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
1ff80 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
1ff90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1ffa0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ffc0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1ffd0 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
20000 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
20010 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
20020 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
20030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20040 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
20050 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
20060 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
20070 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
20080 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
20090 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
200a0 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
200b0 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
200c0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
200d0 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
200e0 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
200f0 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
20100 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
20110 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
20120 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
20130 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
20140 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
20150 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
20160 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
20170 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
20180 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
20190 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
201a0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
201b0 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
201c0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
201d0 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
201e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
201f0 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
20200 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
20210 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
20220 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
20230 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
20240 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
20250 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
20260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20270 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
20280 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20290 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
202a0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
202b0 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
202c0 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
202d0 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
202e0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
202f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20300 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
20310 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
20320 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
20330 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
20340 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
20350 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
20360 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
20370 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20380 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20390 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
203a0 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
203b0 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
203c0 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
203d0 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
203e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
203f0 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
20400 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
20410 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
20420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20430 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
20440 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
20450 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
20460 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20480 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
20490 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
204a0 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
204b0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
204c0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
204d0 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
204e0 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
204f0 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
20500 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
20510 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
20520 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
20530 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
20540 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
20550 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
20560 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
20570 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
20580 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
20590 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
205a0 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
205b0 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
205c0 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
205d0 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
205e0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
205f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20600 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
20610 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
20620 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
20630 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
20640 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
20650 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61  ager->fd) );.  a
20660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
20670 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20  empFile==0 );.  
20680 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57  nPage = sqlite3W
20690 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d  alDbsize(pPager-
206a0 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66  >pWal);..  /* If
206b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
206c0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
206d0 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69  base is not avai
206e0 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20  lable from the. 
206f0 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74   ** WAL sub-syst
20700 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  em, determine th
20710 65 20 70 61 67 65 20 63 6f 75 6e 74 20 62 61 73  e page count bas
20720 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
20730 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
20740 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
20750 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
20760 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
20770 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67  ot an.  ** integ
20780 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
20790 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f  he page-size, ro
207a0 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c  und up the resul
207b0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  t..  */.  if( nP
207c0 61 67 65 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  age==0 && ALWAYS
207d0 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  (isOpen(pPager->
207e0 66 64 29 29 20 29 7b 0a 20 20 20 20 69 36 34 20  fd)) ){.    i64 
207f0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
20800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20810 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
20820 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
20830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
20840 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
20850 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28  fd, &n);.    if(
20860 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20870 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
20880 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
20890 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70  ge = (Pgno)((n+p
208a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
208b0 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  1) / pPager->pag
208c0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
208d0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
208e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
208f0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
20900 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
20910 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
20920 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
20930 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
20940 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
20950 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
20960 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
20970 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
20980 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
20990 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
209a0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
209b0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
209c0 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
209d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
209e0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
209f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
20a00 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
20a10 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
20a20 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
20a30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
20a40 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
20a50 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
20a60 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20a70 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
20a80 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
20a90 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
20aa0 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
20ab0 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
20ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20ad0 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
20ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20af0 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
20b00 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
20b10 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
20b20 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
20b30 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
20b40 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
20b50 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
20b60 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
20b70 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
20b80 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
20b90 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
20ba0 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
20bb0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20bc0 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
20bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20be0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
20bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
20c00 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
20c10 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
20c20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20c30 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
20c40 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
20c50 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
20c60 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
20c70 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
20c80 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
20c90 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
20ca0 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
20cb0 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
20cc0 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
20cd0 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
20ce0 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
20cf0 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
20d00 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
20d10 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
20d20 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
20d30 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
20d40 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
20d50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
20d60 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
20d70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
20d80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20d90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
20da0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
20db0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
20dc0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
20dd0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
20de0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
20df0 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
20e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20e10 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
20e20 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 72 63 20  xists */.    rc 
20e30 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
20e40 73 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  s(.        pPage
20e50 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
20e60 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
20e70 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
20e80 57 61 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Wal.    );.    i
20e90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20ea0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
20eb0 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  Wal ){.        P
20ec0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ee0 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
20ef0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
20f00 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20f10 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20f20 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
20f30 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20f40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
20f50 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
20f60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20f70 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
20f80 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
20f90 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
20fa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20fb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20fc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
20fd0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
20fe0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
20ff0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21000 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
21010 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  l(pPager, 0);.  
21020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21030 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
21040 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
21050 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
21060 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AL ){.        pP
21070 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
21080 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
21090 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20  LMODE_DELETE;.  
210a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
210b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
210c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  endif../*.** Pla
210d0 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
210e0 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
210f0 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
21100 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
21110 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
21120 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21130 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
21140 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
21150 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
21160 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
21170 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
21180 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
21190 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
211a0 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
211b0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
211c0 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
211d0 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
211e0 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
211f0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
21200 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
21210 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
21220 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
21230 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
21240 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
21250 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
21260 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
21270 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
21280 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
21290 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
212a0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
212b0 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
212c0 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
212d0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
212e0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
212f0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
21300 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
21310 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
21320 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21330 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
21340 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
21350 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
21360 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
21370 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
21380 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
21390 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
213a0 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
213b0 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
213c0 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
213d0 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
213e0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
213f0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
21400 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
21410 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
21420 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21430 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
21440 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
21450 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
21460 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
21470 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
21480 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
21490 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
214a0 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
214b0 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
214c0 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
214d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
214e0 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
214f0 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
21500 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
21510 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
21520 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
21530 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
21540 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
21550 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
21560 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
21570 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
21580 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
21590 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
215a0 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
215b0 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
215c0 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
215d0 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
215e0 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
215f0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
21600 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
21610 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
21620 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
21630 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
21640 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
21650 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
21660 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
21670 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
21680 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
21690 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
216a0 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
216b0 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
216c0 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
216d0 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
216e0 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
216f0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
21700 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
21710 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
21720 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
21730 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
21740 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
21750 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
21760 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
21770 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
21780 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
21790 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
217a0 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
217b0 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
217c0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
217d0 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
217e0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
217f0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
21800 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
21810 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
21820 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
21830 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
21840 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
21850 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
21860 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
21870 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
21880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21890 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
218a0 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
218b0 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
218c0 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
218d0 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
218e0 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
218f0 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
21900 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
21910 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
21920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21930 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
21940 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
21950 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
21960 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
21970 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
21980 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
21990 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
219a0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
219b0 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
219c0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
219d0 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
219e0 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
219f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21a00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
21a10 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
21a20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
21a30 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
21a40 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
21a50 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
21a60 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
21a70 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
21a80 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
21a90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
21aa0 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
21ab0 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
21ac0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
21ad0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
21ae0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
21af0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21b00 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
21b10 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
21b20 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21b30 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
21b40 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
21b50 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
21b60 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
21b70 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
21b80 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
21b90 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
21ba0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
21bb0 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
21bc0 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
21bd0 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
21be0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
21bf0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
21c00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21c10 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
21c20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
21c30 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
21c40 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
21c50 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
21c60 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
21c70 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
21c80 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
21c90 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
21ca0 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
21cb0 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
21cc0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
21cd0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
21ce0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21cf0 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
21d00 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
21d10 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
21d20 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
21d30 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
21d40 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
21d50 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
21d60 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
21d70 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
21d80 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
21d90 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
21da0 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
21db0 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
21dc0 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
21dd0 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
21de0 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
21df0 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
21e00 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
21e10 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
21e20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
21e30 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
21e40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21e50 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
21e60 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
21e70 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
21e80 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
21e90 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
21ea0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21eb0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
21ec0 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
21ed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21ee0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21ef0 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
21f00 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21f10 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
21f20 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
21f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21f40 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
21f50 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21f60 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21f70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21f80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21f90 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
21fa0 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
21fb0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
21fc0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
21fd0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21fe0 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
21ff0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
22000 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
22010 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
22020 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
22030 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
22040 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
22050 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
22060 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
22070 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
22080 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
22090 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
220a0 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
220b0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
220c0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
220d0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
220e0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
220f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22100 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
22110 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
22120 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
22130 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
22140 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
22150 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
22160 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
22170 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
22180 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
22190 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
221a0 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
221b0 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
221c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
221d0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
221e0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
221f0 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
22200 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
22210 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
22220 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
22230 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
22240 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
22250 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
22260 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
22270 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
22280 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
22290 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
222a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
222b0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
222c0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
222d0 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
222e0 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
222f0 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
22300 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
22310 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
22320 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
22330 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
22340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
22350 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
22360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
22370 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
22380 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
22390 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
223a0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
223b0 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
223c0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
223d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
223e0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
223f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22400 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
22410 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
22420 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
22430 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
22440 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
22450 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
22460 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
22470 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
22480 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
22490 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
224a0 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
224b0 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
224c0 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
224d0 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
224e0 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
224f0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
22500 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
22510 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
22520 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22530 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
22540 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76  fset = (i64)pSav
22550 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
22560 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
22570 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
22580 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
22590 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
225a0 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
225b0 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
225c0 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
225d0 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
225e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
225f0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
22600 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
22610 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
22620 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
22630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
22640 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34  fset==(i64)ii*(4
22650 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
22660 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
22670 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
22680 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
22690 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c   &offset, pDone,
226a0 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
226b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
226c0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
226d0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
226e0 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
226f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
22710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
22720 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   szJ;.  }..  ret
22730 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22740 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
22750 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
22760 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
22770 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a  at are allowed.*
22780 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  * before attempt
22790 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63  ing to recycle c
227a0 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20  lean and unused 
227b0 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pages..*/.void s
227c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
227d0 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
227e0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
227f0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
22800 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
22810 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
22820 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
22830 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
22840 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
22850 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
22860 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
22870 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
22880 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70  pting to spill p
22890 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e  ages to journal.
228a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
228b0 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65  agerSetSpillsize
228c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
228d0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72  int mxPage){.  r
228e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
228f0 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  cheSetSpillsize(
22900 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
22910 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
22920 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45  ** Invoke SQLITE
22930 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
22940 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
22950 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73  rrent value of s
22960 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  zMmap..*/.static
22970 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61   void pagerFixMa
22980 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  plimit(Pager *pP
22990 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54  ager){.#if SQLIT
229a0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
229b0 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  0.  sqlite3_file
229c0 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66   *fd = pPager->f
229d0 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  d;.  if( isOpen(
229e0 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68  fd) && fd->pMeth
229f0 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
22a00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
22a10 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a  int64 sz;.    sz
22a20 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61   = pPager->szMma
22a30 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62  p;.    pPager->b
22a40 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30  UseFetch = (sz>0
22a50 29 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65 72  );.    setGetter
22a60 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a  Method(pPager);.
22a70 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
22a80 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
22a90 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
22aa0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
22ab0 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   &sz);.  }.#endi
22ac0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  f.}../*.** Chang
22ad0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  e the maximum si
22ae0 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79  ze of any memory
22af0 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66   mapping made of
22b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22b10 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
22b20 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
22b30 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
22b40 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  er, sqlite3_int6
22b50 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61  4 szMmap){.  pPa
22b60 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a  ger->szMmap = sz
22b70 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78  Mmap;.  pagerFix
22b80 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
22b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
22ba0 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
22bb0 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
22bc0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f  the pager..*/.vo
22bd0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22be0 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61  hrink(Pager *pPa
22bf0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
22c00 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67  cacheShrink(pPag
22c10 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
22c20 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65  ./*.** Adjust se
22c30 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  ttings of the pa
22c40 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65  ger to those spe
22c50 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67  cified in the pg
22c60 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  Flags parameter.
22c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65  .**.** The "leve
22c80 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20  l" in pgFlags & 
22c90 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
22ca0 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20  S_MASK sets the 
22cb0 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66  robustness.** of
22cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
22cd0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
22ce0 53 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77  S crashes or pow
22cf0 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a  er failures by.*
22d00 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  * changing the n
22d10 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
22d20 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  s when writing t
22d30 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  he journals..** 
22d40 54 68 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c  There are four l
22d50 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
22d60 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
22d70 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
22d80 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
22d90 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
22da0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22db0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
22dc0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
22dd0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
22de0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
22df0 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
22e00 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
22e10 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
22e20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
22e30 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
22e40 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
22e50 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
22e60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22e70 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
22e80 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
22e90 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
22ea0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
22eb0 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
22ec0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
22ed0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
22ee0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
22f00 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
22f10 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
22f20 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
22f30 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22f40 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
22f50 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
22f60 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
22f70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
22f80 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
22f90 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
22fa0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
22fb0 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
22fc0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
22fd0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
22fe0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
22ff0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23000 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
23010 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
23020 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
23030 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
23040 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
23050 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
23060 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
23080 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
23090 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
230a0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
230b0 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
230c0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
230d0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
230e0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
230f0 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
23100 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
23110 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
23120 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
23130 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
23140 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58  ack..**.**    EX
23150 54 52 41 20 20 20 20 20 54 68 69 73 20 69 73 20  TRA     This is 
23160 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74  like FULL except
23170 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79   that is also sy
23180 6e 63 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  ncs the director
23190 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
231a0 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20    that contains 
231b0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
231c0 72 6e 61 6c 20 61 66 74 65 72 20 74 68 65 20 72  rnal after the r
231d0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20  ollback.**      
231e0 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
231f0 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a  is unlinked..**.
23200 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
23210 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a  for a rollback-j
23220 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f  ournal mode.  Fo
23230 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20  r WAL mode, OFF 
23240 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20  continues.** to 
23250 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e  mean that no syn
23260 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20  cs ever occur.  
23270 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61  NORMAL means tha
23280 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e  t the WAL is syn
23290 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ced.** prior to 
232a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65  the start of che
232b0 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74  ckpoint and that
232c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
232d0 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20  le is synced.** 
232e0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
232f0 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f  n of the checkpo
23300 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72  int if the entir
23310 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
23320 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74   WAL.** was writ
23330 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
23340 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74  e database.  But
23350 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69   no sync operati
23360 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a  ons occur for.**
23370 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d   an ordinary com
23380 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f  mit in NORMAL mo
23390 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55  de with WAL.  FU
233a0 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
233b0 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73  e WAL.** file is
233c0 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
233d0 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70  g each commit op
233e0 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69  eration, in addi
233f0 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73  tion to the.** s
23400 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20  yncs associated 
23410 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68  with NORMAL.  Th
23420 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
23430 65 6e 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c  ence between FUL
23440 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66  L.** and EXTRA f
23450 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  or WAL mode..**.
23460 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73  ** Do not confus
23470 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  e synchronous=FU
23480 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53  LL with SQLITE_S
23490 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a  YNC_FULL.  The.*
234a0 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  * SQLITE_SYNC_FU
234b0 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74  LL macro means t
234c0 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58  o use the MacOSX
234d0 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e  -style full-fsyn
234e0 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c  c.** using fcntl
234f0 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20  (F_FULLFSYNC).  
23500 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23510 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61  AL means to do a
23520 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73  n.** ordinary fs
23530 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65  ync() call.  The
23540 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65  re is no differe
23550 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49  nce between SQLI
23560 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20  TE_SYNC_FULL.** 
23570 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  and SQLITE_SYNC_
23580 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f  NORMAL on platfo
23590 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d  rms other than M
235a0 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a  acOSX.  But the.
235b0 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  ** synchronous=F
235c0 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68  ULL versus synch
235d0 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65  ronous=NORMAL se
235e0 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73  tting determines
235f0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79   when.** the xSy
23600 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20  nc primitive is 
23610 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65  called and is re
23620 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c  levant to all pl
23630 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e  atforms..**.** N
23640 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
23650 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
23660 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
23670 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
23680 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
23690 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
236a0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
236b0 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
236c0 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a  3PagerSetFlags(.
236d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
236e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
236f0 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65  ager to set safe
23700 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a  ty level for */.
23710 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
23720 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  gs      /* Vario
23730 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  us flags */.){. 
23740 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20   unsigned level 
23750 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  = pgFlags & PAGE
23760 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
23770 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  SK;.  if( pPager
23780 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
23790 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
237a0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
237b0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a  ->fullSync = 0;.
237c0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
237d0 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  aSync = 0;.  }el
237e0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
237f0 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
23800 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
23810 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20  US_OFF ?1:0;.   
23820 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
23830 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52  c = level>=PAGER
23840 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c  _SYNCHRONOUS_FUL
23850 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  L ?1:0;.    pPag
23860 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20  er->extraSync = 
23870 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e  level==PAGER_SYN
23880 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f  CHRONOUS_EXTRA ?
23890 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1:0;.  }.  if( p
238a0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
238b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
238c0 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
238d0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
238e0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
238f0 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
23900 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43   PAGER_FULLFSYNC
23910 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23920 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
23930 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
23940 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
23950 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23960 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
23970 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20  lse if( pgFlags 
23980 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c  & PAGER_CKPT_FUL
23990 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
239a0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
239b0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
239c0 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
239d0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
239e0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
239f0 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
23a00 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
23a10 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
23a20 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
23a30 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
23a40 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
23a50 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
23a60 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
23a70 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79  ags = pPager->sy
23a80 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  ncFlags;.  if( p
23a90 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
23aa0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
23ab0 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57  alSyncFlags |= W
23ac0 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
23ad0 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  IONS;.  }.  if( 
23ae0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23af0 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20  CACHESPILL ){.  
23b00 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
23b10 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
23b20 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b  AG_OFF;.  }else{
23b30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
23b40 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
23b50 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a  FLAG_OFF;.  }.}.
23b60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
23b70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
23b80 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
23b90 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
23ba0 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
23bb0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
23bc0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
23bd0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
23be0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
23bf0 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
23c00 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
23c10 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
23c20 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
23c30 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
23c40 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
23c50 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
23c60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
23c70 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
23c80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
23c90 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
23ca0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
23cb0 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
23cc0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
23cd0 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
23ce0 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
23cf0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
23d00 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
23d10 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
23d20 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
23d30 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
23d40 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
23d50 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
23d60 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
23d70 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
23d80 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
23d90 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
23da0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
23db0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23dc0 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
23dd0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
23de0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
23df0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
23e00 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23e10 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
23e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
23e30 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
23e40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23e50 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
23e60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
23e70 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
23e80 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
23e90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
23ea0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
23eb0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
23ec0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
23ed0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
23ee0 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
23ef0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
23f00 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
23f10 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
23f20 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
23f30 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
23f40 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
23f50 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
23f60 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
23f70 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
23f80 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
23f90 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
23fa0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
23fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
23fc0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
23fd0 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
23fe0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
23ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24000 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
24010 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
24020 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
24030 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
24040 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
24050 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
24060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
24070 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
24080 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
24090 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
240a0 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
240b0 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
240c0 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
240d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
240e0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
240f0 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
24100 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
24110 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
24120 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
24130 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
24140 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
24150 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
24160 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
24170 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
24180 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
24190 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
241a0 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
241b0 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
241c0 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
241d0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
241e0 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
241f0 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
24200 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
24210 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
24220 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
24250 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
24260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24290 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
242a0 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
242b0 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
242c0 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
242d0 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
242e0 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
242f0 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
24300 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
24310 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
24320 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
24330 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
24340 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
24350 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
24360 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
24370 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
24380 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
24390 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
243a0 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
243b0 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
243c0 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
243d0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
243e0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
243f0 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
24400 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
24410 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
24420 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
24450 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
24460 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
24470 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
24480 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
24490 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
244a0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
244b0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
244d0 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
244e0 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
244f0 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  er */.){.  pPage
24500 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
24510 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = xBusyHandler;.
24520 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
24530 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73  andlerArg = pBus
24540 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20  yHandlerArg;..  
24550 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
24560 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f  r->fd) ){.    vo
24570 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20  id **ap = (void 
24580 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73  **)&pPager->xBus
24590 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73  yHandler;.    as
245a0 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76  sert( ((int(*)(v
245b0 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d  oid *))(ap[0]))=
245c0 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b  =xBusyHandler );
245d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b  .    assert( ap[
245e0 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72  1]==pBusyHandler
245f0 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Arg );.    sqlit
24600 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
24610 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
24620 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53  SQLITE_FCNTL_BUS
24630 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20  YHANDLER, (void 
24640 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  *)ap);.  }.}../*
24650 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
24660 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
24670 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
24680 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
24690 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
246a0 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
246b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
246c0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
246d0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
246e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
246f0 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
24700 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
24710 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
24720 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
24730 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
24740 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
24750 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51  ITE_IOERR, an SQ
24760 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73  LITE_IOERR_xxx s
24770 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54  ub-code or SQLIT
24780 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
24790 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
247a0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
247b0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
247c0 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
247d0 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
247e0 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
247f0 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
24800 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
24810 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
24820 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
24830 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
24840 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
24850 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
24860 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
24870 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
24880 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
24890 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
248a0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
248b0 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
248c0 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
248d0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
248e0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
248f0 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
24900 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
24910 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
24920 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
24930 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
24940 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
24950 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
24960 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
24970 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
24980 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
24990 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
249a0 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
249b0 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
249c0 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
249d0 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
249e0 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
249f0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
24a00 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
24a10 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
24a20 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
24a30 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
24a40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
24a50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
24a60 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
24a70 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
24a80 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
24a90 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
24aa0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
24ab0 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
24ac0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
24ad0 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
24ae0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
24af0 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
24b00 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
24b10 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
24b20 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
24b30 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
24b40 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
24b50 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
24b60 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
24b70 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
24b80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
24b90 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
24ba0 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67  Pager, u32 *pPag
24bb0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
24bc0 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
24bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
24be0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
24bf0 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c  ible to do a ful
24c00 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  l assert_pager_s
24c10 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20  tate() here, as 
24c20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
24c30 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
24c40 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67   from within Pag
24c50 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65  erOpen(), before
24c60 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20   the state.  ** 
24c70 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
24c80 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  ect is internall
24c90 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  y consistent..  
24ca0 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70  **.  ** At one p
24cb0 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69  oint this functi
24cc0 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
24cd0 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  rror if the page
24ce0 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50  r was in .  ** P
24cf0 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
24d00 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45  . But since PAGE
24d10 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75  R_ERROR state gu
24d20 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20  arantees that.  
24d30 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c  ** there is at l
24d40 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
24d50 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
24d60 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nce, this functi
24d70 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d  on.  ** is a no-
24d80 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65  op for that case
24d90 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20   anyhow..  */.. 
24da0 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20   u32 pageSize = 
24db0 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  *pPageSize;.  as
24dc0 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
24dd0 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
24de0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
24df0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
24e00 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20  _SIZE) );.  if( 
24e10 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
24e20 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
24e30 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71  ize==0).   && sq
24e40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
24e50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
24e60 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70  che)==0 .   && p
24e70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
24e80 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72  ize!=(u32)pPager
24e90 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b  ->pageSize .  ){
24ea0 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20  .    char *pNew 
24eb0 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
24ec0 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20      /* New temp 
24ed0 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34  space */.    i64
24ee0 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20   nByte = 0;..   
24ef0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
24f00 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26  ate>PAGER_OPEN &
24f10 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
24f20 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63  >fd) ){.      rc
24f30 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
24f40 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
24f50 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a   &nByte);.    }.
24f60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24f70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
24f80 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
24f90 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
24fa0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
24fb0 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20   if( !pNew ) rc 
24fc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
24fd0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
24fe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24ff0 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
25000 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
25010 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25020 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
25030 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
25040 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
25050 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
25060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25070 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
25080 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
25090 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
250a0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
250b0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
250c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
250d0 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
250e0 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
250f0 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
25100 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
25110 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  geSize;.    }els
25120 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
25130 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  PageFree(pNew);.
25140 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
25150 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
25160 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
25170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25180 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  ){.    if( nRese
25190 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
251a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
251b0 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
251c0 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
251d0 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
251e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
251f0 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
25200 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
25210 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
25220 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78  r);.    pagerFix
25230 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
25240 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25250 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
25260 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25270 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
25280 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
25290 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
252a0 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
252b0 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
252c0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
252d0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
252e0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
252f0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
25300 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
25310 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
25320 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
25330 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
25340 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
25350 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
25360 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
25370 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
25380 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
25390 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
253a0 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
253b0 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
253c0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
253d0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
253e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
253f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
25400 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
25410 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
25420 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
25430 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
25440 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
25450 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
25460 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
25470 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
25480 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
25490 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
254a0 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
254b0 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
254c0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
254d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
254e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
254f0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
25500 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
25510 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
25520 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
25530 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
25540 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
25550 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
25560 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
25570 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
25580 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
25590 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
255a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
255b0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
255c0 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
255d0 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
255e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
255f0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
25600 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
25610 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
25620 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
25630 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
25640 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
25650 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
25660 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
25670 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
25680 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
25690 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
256a0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
256b0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
256c0 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
256d0 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
256e0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
256f0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
25700 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
25710 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
25720 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
25730 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
25740 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
25750 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
25760 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
25770 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
25780 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
25790 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
257a0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
257b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
257c0 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
257d0 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
257e0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
257f0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
25800 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
25810 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
25820 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
25830 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
25840 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
25850 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
25860 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
25870 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
25880 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
25890 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
258a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
258b0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
258c0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
258d0 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
258e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
258f0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
25900 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
25910 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
25920 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
25930 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
25940 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
25950 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
25960 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
25970 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
25980 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
25990 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
259a0 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
259b0 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
259c0 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
259d0 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
259e0 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
259f0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
25a00 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
25a10 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
25a20 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
25a30 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
25a40 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
25a50 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
25a60 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
25a70 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
25a80 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
25a90 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
25aa0 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
25ab0 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
25ac0 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
25ad0 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
25ae0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
25af0 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
25b00 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
25b10 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
25b20 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
25b30 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
25b40 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
25b50 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
25b60 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
25b70 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
25b80 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
25b90 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
25ba0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
25bb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
25bc0 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
25bd0 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
25be0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
25bf0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
25c00 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
25c10 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
25c20 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
25c30 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
25c40 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
25c50 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
25c60 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
25c70 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
25c80 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
25c90 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
25ca0 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
25cb0 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
25cc0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
25cd0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
25ce0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
25cf0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
25d00 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
25d10 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
25d20 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
25d30 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
25d40 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
25d50 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
25d60 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
25d70 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
25d80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25d90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
25da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25db0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25dc0 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
25dd0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
25de0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
25df0 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
25e00 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
25e10 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
25e20 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
25e30 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
25e40 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
25e50 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
25e60 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
25e70 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
25e80 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
25e90 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
25ea0 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
25eb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25ec0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
25ed0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25ee0 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
25ef0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25f00 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
25f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25f20 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
25f30 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
25f40 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
25f50 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
25f60 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
25f70 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
25f80 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
25f90 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
25fa0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
25fb0 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
25fc0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
25fd0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
25fe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25ff0 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
26000 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
26010 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
26020 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
26030 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
26040 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
26050 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
26060 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
26070 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
26080 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
26090 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
260a0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
260b0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
260c0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
260d0 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
260e0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
260f0 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
26100 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
26110 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
26120 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
26130 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
26140 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
26150 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
26160 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
26170 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
26180 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
26190 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
261a0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
261b0 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
261c0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
261d0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
261e0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
261f0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
26200 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26230 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
26240 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
26250 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
26260 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
26270 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
26280 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
26290 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e  ady held), or on
262a0 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  e of the transit
262b0 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
262c0 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
262d0 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
262e0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
262f0 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
26300 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
26310 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
26320 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
26330 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
26340 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
26350 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
26360 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
26370 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
26380 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
26390 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
263a0 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
263b0 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
263c0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
263d0 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
263e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
263f0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
26400 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
26410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
26420 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
26430 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
26440 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
26450 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
26460 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
26470 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
26480 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
26490 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
264a0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
264b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
264c0 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
264d0 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
264e0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
264f0 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
26500 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
26510 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
26520 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
26530 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
26540 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
26550 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
26560 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
26570 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
26580 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
26590 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
265a0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
265b0 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
265c0 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
265d0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
265e0 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
265f0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
26600 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
26610 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
26620 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
26630 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
26640 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
26650 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
26660 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
26670 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
26680 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
26690 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
266a0 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
266b0 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
266c0 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
266d0 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
266e0 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
266f0 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
26700 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
26710 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
26720 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
26730 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
26740 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
26750 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
26760 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
26770 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  or would be to r
26780 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
26790 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
267a0 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
267b0 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
267c0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
267d0 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
267e0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
267f0 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
26800 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
26810 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
26820 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
26830 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
26840 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
26850 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
26860 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
26870 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
26880 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
26890 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
268a0 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
268b0 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
268c0 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
268d0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
268e0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
268f0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
26900 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26910 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
26920 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
26930 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
26940 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
26950 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
26960 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
26970 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
26980 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
26990 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
269a0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
269b0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
269c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
269d0 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
269e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
269f0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26a00 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
26a10 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
26a20 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26a30 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
26a40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
26a50 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
26a60 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
26a70 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
26a80 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
26a90 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
26aa0 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
26ab0 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
26ac0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
26ad0 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
26ae0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
26af0 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
26b00 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
26b10 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
26b20 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
26b30 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
26b40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
26b50 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
26b60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26b70 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68  only called righ
26b80 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
26b90 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
26ba0 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  n..** Once this 
26bb0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
26bc0 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72  n called, the tr
26bd0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65  ansaction must e
26be0 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c  ither be.** roll
26bf0 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ed back or commi
26c00 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20  tted. It is not 
26c10 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  safe to call thi
26c20 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a  s function and.*
26c30 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  * then continue 
26c40 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
26c50 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
26c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
26c70 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
26c80 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
26c90 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
26ca0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
26cb0 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
26cc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
26cd0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
26ce0 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
26cf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
26d00 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20  nPage;..  /* At 
26d10 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f  one point the co
26d20 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61  de here called a
26d30 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26d40 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a  straint() to.  *
26d50 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c  * ensure that al
26d60 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72  l pages being tr
26d70 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20  uncated away by 
26d80 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61  this operation a
26d90 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  re,.  ** if one 
26da0 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
26db0 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65  ts are open, pre
26dc0 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65  sent in the save
26dd0 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72  point .  ** jour
26de0 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79  nal so that they
26df0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
26e00 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   if the savepoin
26e10 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  t is rolled.  **
26e20 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e   back. This is n
26e30 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61  o longer necessa
26e40 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  ry as this funct
26e50 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a  ion is now only.
26e60 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68    ** called righ
26e70 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
26e80 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
26e90 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74  n. So although t
26ea0 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f  he .  ** Pager o
26eb0 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20  bject may still 
26ec0 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  have open savepo
26ed0 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76  ints (Pager.nSav
26ee0 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a  epoint!=0), .  *
26ef0 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65  * they cannot be
26f00 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f   rolled back. So
26f10 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63   the assertTrunc
26f20 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
26f30 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  call.  ** is no 
26f40 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20  longer correct. 
26f50 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.}.../*.** Thi
26f60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26f70 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
26f80 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
26f90 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
26fa0 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
26fb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
26fc0 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
26fd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26fe0 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
26ff0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
27000 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
27010 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
27020 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
27030 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
27040 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
27050 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
27060 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
27070 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
27080 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
27090 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
270a0 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
270b0 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
270c0 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
270d0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
270e0 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
270f0 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
27100 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
27110 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
27120 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
27130 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
27140 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
27150 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
27160 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
27170 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
27180 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27190 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
271a0 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
271b0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
271c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
271d0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
271e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
271f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27200 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
27210 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
27220 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
27230 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
27240 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
27250 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
27260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27270 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
27280 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
27290 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
272a0 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
272b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
272c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
272d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
272e0 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
272f0 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79  ence to a memory
27300 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a   mapped page obj
27310 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  ect for page num
27320 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68  ber pgno. .** Th
27330 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
27340 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65  l use the pointe
27350 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65  r pData, obtaine
27360 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e  d from xFetch().
27370 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
27380 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74  l, set *ppPage t
27390 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
273a0 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ew page referenc
273b0 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
273c0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
273d0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
273e0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
273f0 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70  e and set.** *pp
27400 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  Page to zero..**
27410 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e  .** Page referen
27420 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ces obtained by 
27430 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
27440 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
27450 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63  released.** by c
27460 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65  alling pagerRele
27470 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  aseMapPage()..*/
27480 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
27490 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
274a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
274b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
274c0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
274d0 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ct */.  Pgno pgn
274e0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
274f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
27500 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64  number */.  void
27510 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
27520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27530 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66  Fetch()'d data f
27540 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
27550 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65    PgHdr **ppPage
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27570 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
27580 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a  ed page object *
27590 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  /.){.  PgHdr *p;
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275b0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
275c0 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20   mapped page to 
275d0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69  return */.  .  i
275e0 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  f( pPager->pMmap
275f0 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
27600 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50  *ppPage = p = pP
27610 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27620 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ist;.    pPager-
27630 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
27640 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
27650 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
27660 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27670 72 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a  r->nExtra>=8 );.
27680 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45      memset(p->pE
27690 78 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d  xtra, 0, 8);.  }
276a0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
276b0 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
276c0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
276d0 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
276e0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
276f0 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
27700 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27710 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
27720 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
27730 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
27740 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
27750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27760 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
27770 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45  .    }.    p->pE
27780 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  xtra = (void *)&
27790 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  p[1];.    p->fla
277a0 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b  gs = PGHDR_MMAP;
277b0 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
277c0 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20  ;.    p->pPager 
277d0 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20  = pPager;.  }.. 
277e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74   assert( p->pExt
277f0 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31  ra==(void *)&p[1
27800 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
27810 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->pPage==0 );.  
27820 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
27830 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a  ==PGHDR_MMAP );.
27840 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
27850 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
27860 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
27870 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e  ==1 );..  p->pgn
27880 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70  o = pgno;.  p->p
27890 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
278a0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
278b0 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
278c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
278d0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  f../*.** Release
278e0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
278f0 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75  page pPg. pPg mu
27900 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74  st have been ret
27910 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20  urned by an .** 
27920 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
27930 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
27940 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
27950 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61   void pagerRelea
27960 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20  seMapPage(PgHdr 
27970 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
27980 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
27990 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ager;.  pPager->
279a0 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50  nMmapOut--;.  pP
279b0 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
279c0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
279d0 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  t;.  pPager->pMm
279e0 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67  apFreelist = pPg
279f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
27a00 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
27a10 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
27a20 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ;.  sqlite3OsUnf
27a30 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
27a40 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f   (i64)(pPg->pgno
27a50 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
27a60 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61  Size, pPg->pData
27a70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
27a80 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63   all PgHdr objec
27a90 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ts stored in the
27aa0 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65   Pager.pMmapFree
27ab0 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  list list..*/.st
27ac0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
27ad0 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72  reeMapHdrs(Pager
27ae0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
27af0 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a  dr *p;.  PgHdr *
27b00 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
27b10 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27b20 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74  list; p; p=pNext
27b30 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
27b40 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71  ->pDirty;.    sq
27b50 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
27b60 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75   }.}.../*.** Shu
27b70 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
27b80 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
27b90 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
27ba0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
27bb0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
27bc0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
27bd0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
27be0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
27bf0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
27c00 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
27c10 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
27c20 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
27c30 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
27c40 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
27c50 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
27c60 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
27c70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
27c80 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
27c90 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
27ca0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
27cb0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
27cc0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
27cd0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
27ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
27cf0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
27d00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
27d10 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
27d20 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
27d30 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
27d40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
27d50 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
27d60 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
27d70 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
27d80 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
27d90 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
27da0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
27db0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
27dc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27dd0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
27de0 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
27df0 20 2a 64 62 29 7b 0a 20 20 75 38 20 2a 70 54 6d   *db){.  u8 *pTm
27e00 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72  p = (u8 *)pPager
27e10 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20  ->pTmpSpace;..  
27e20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70 61  assert( db || pa
27e30 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
27e40 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
27e50 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
27e60 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
27e70 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
27e80 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
27e90 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
27ea0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
27eb0 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
27ec0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20  s(pPager);.  /* 
27ed0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
27ee0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
27ef0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
27f00 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
27f10 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
27f20 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70 50 61  ssert( db || pPa
27f30 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a  ger->pWal==0 );.
27f40 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
27f50 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
27f60 64 62 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  db, pPager->ckpt
27f70 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65  SyncFlags, pPage
27f80 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
27f90 20 20 20 28 64 62 20 26 26 20 28 64 62 2d 3e 66     (db && (db->f
27fa0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f  lags & SQLITE_No
27fb0 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 3f 20 30  CkptOnClose) ? 0
27fc0 20 3a 20 70 54 6d 70 29 0a 20 20 29 3b 0a 20 20   : pTmp).  );.  
27fd0 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
27fe0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
27ff0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
28000 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
28010 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
28020 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
28030 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
28040 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
28050 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
28060 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
28070 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
28080 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
28090 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
280a0 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
280b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
280c0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
280d0 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
280e0 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
280f0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
28100 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
28110 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
28120 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
28130 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
28140 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
28150 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
28160 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
28170 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
28180 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
28190 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
281a0 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
281b0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
281c0 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
281d0 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
281e0 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
281f0 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
28200 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
28210 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28220 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
28230 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
28240 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
28250 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
28260 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
28270 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
28280 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
28290 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
282a0 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
282b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
282c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
282d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
282e0 6a 66 64 29 20 29 7b 0a 23 69 66 20 30 0a 20 20  jfd) ){.#if 0.  
282f0 20 20 20 20 69 66 28 20 70 61 67 65 72 49 73 53      if( pagerIsS
28300 65 72 76 65 72 28 70 50 61 67 65 72 29 20 29 7b  erver(pPager) ){
28310 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28320 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28330 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
28340 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
28350 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
28360 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
28370 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
28380 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
28390 20 20 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61     /* If necessa
283a0 72 79 2c 20 63 68 61 6e 67 65 20 74 68 65 20 70  ry, change the p
283b0 61 67 65 72 20 73 74 61 74 65 20 73 6f 20 74 68  ager state so th
283c0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
283d0 69 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile .        ** 
283e0 69 73 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  is deleted by th
283f0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 55  e call to pagerU
28400 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
28410 28 29 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  () below.  */.  
28420 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
28430 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
28440 4f 50 45 4e 20 29 20 70 50 61 67 65 72 2d 3e 65  OPEN ) pPager->e
28450 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
28460 41 44 45 52 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ADER;.      }.#e
28470 6e 64 69 66 0a 20 20 20 20 20 20 70 61 67 65 72  ndif.      pager
28480 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
28490 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
284a0 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
284b0 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
284c0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
284d0 61 67 65 72 29 3b 0a 20 20 7d 0a 23 69 66 64 65  ager);.  }.#ifde
284e0 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f  f SQLITE_SERVER_
284f0 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 70 61  EDITION.  if( pa
28500 67 65 72 49 73 53 65 72 76 65 72 28 70 50 61 67  gerIsServer(pPag
28510 65 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  er) ){.    sqlit
28520 65 33 53 65 72 76 65 72 44 69 73 63 6f 6e 6e 65  e3ServerDisconne
28530 63 74 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76  ct(pPager->pServ
28540 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 29 3b  er, pPager->fd);
28550 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 65  .    pPager->pSe
28560 72 76 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rver = 0;.  }els
28570 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e{.    sqlite3Os
28580 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
28590 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
285a0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
285b0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
285c0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
285d0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
285e0 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
285f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28600 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
28610 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
28620 22 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 73  ", pPager));.  s
28630 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
28640 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
28650 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d  ite3PageFree(pTm
28660 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  p);.  sqlite3Pca
28670 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
28680 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
28690 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
286a0 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
286b0 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
286c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
286d0 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
286e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
286f0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
28700 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
28710 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
28720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
28730 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
28740 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
28750 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
28760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28770 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
28780 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
28790 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
287a0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
287b0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
287c0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
287d0 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
287e0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
287f0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
28800 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
28810 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
28820 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
28830 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
28840 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
28850 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
28860 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
28870 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
28880 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
28890 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
288a0 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
288b0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
288c0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
288d0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
288e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
288f0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
28900 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
28910 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
28920 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
28930 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
28940 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
28950 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
28960 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
28970 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
28980 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
28990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
289a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
289b0 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
289c0 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
289d0 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
289e0 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a  l-mode and the .
289f0 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ** device charac
28a00 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65  teristics of the
28a10 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
28a20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
28a30 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
28a40 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
28a50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
28a60 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
28a70 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
28a80 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
28a90 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
28aa0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
28ab0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
28ac0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
28ad0 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
28ae0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
28af0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
28b00 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
28b10 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
28b20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
28b30 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
28b40 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
28b50 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
28b60 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
28b70 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
28b80 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
28b90 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
28ba0 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
28bb0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
28bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
28bd0 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
28be0 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
28bf0 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
28c00 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
28c10 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
28c20 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
28c30 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
28c40 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
28c50 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
28c60 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
28c70 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
28c80 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
28c90 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
28ca0 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
28cb0 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
28cc0 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
28cd0 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
28ce0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
28cf0 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
28d00 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
28d10 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
28d20 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
28d30 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
28d40 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
28d50 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
28d60 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
28d70 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
28d80 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
28d90 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
28da0 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
28db0 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
28dc0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
28dd0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
28de0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
28df0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
28e00 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
28e10 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
28e20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
28e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
28e40 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
28e50 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
28e60 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
28e90 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
28ea0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
28eb0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
28ec0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
28ed0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
28ee0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
28ef0 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
28f00 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
28f10 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
28f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
28f30 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
28f40 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
28f50 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
28f60 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
28f70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
28f80 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28f90 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
28fa0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
28fb0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
28fc0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
28fd0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
28fe0 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
28ff0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
29000 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
29010 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
29020 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
29030 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
29040 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
29050 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
29060 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
29070 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
29080 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
29090 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
290a0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
290b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
290c0 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
290d0 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
290e0 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
290f0 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
29100 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
29110 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
29120 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
29130 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
29140 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
29150 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
29160 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29170 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
29180 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
29190 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
291a0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
291b0 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
291c0 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
291d0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
291e0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
291f0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
29200 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
29210 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
29220 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
29230 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
29240 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
29250 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
29260 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
29270 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
29280 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
29290 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
292a0 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
292b0 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
292c0 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
292d0 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
292e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
292f0 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
29300 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
29310 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
29320 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
29330 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
29340 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
29350 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
29360 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
29370 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
29380 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
29390 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
293a0 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
293b0 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
293c0 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
293d0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
293e0 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
293f0 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
29400 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
29410 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
29420 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
29430 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
29440 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
29450 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
29460 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
29470 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
29480 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
29490 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
294a0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
294b0 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
294c0 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
294d0 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
294e0 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
294f0 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
29500 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
29510 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29520 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
29530 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
29540 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
29550 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
29560 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
29570 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
29580 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
29590 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
295a0 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
295b0 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
295c0 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
295d0 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
295e0 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
295f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
29600 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
29610 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
29620 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
29630 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
29640 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
29650 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
29660 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
29670 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
29680 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
29690 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
296a0 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
296b0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
296c0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
296d0 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
296e0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
296f0 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
29700 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
29710 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
29720 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
29730 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
29740 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
29750 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
29760 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
29770 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
29780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29790 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
297a0 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
297b0 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
297c0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
297d0 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
297e0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
297f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29800 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
29810 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
29820 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
29830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29850 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
29860 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
29870 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
29880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29890 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
298a0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
298b0 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
298c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
298d0 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
298e0 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
298f0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
29900 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
29910 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
29920 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
29930 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
29940 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
29950 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
29960 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
29970 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
29980 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
29990 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
299a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
299b0 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
299c0 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
299d0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
299e0 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
299f0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
29a00 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
29a10 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
29a20 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
29a30 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
29a40 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
29a50 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
29a60 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
29a70 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
29a80 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
29a90 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
29aa0 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
29ab0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
29ac0 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
29ad0 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
29ae0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
29af0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
29b00 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29b10 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
29b20 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29b30 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
29b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
29b50 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
29b60 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
29b70 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29b80 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
29b90 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
29ba0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
29bb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29bc0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
29bd0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
29be0 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
29bf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29c00 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29c10 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
29c20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
29c30 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
29c40 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
29c50 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
29c60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29c70 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
29c80 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
29c90 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
29ca0 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
29cb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
29cc0 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
29cd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29ce0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29cf0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
29d00 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
29d10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
29d20 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
29d30 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29d40 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
29d50 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29d60 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
29d70 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
29d80 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
29d90 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
29da0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
29db0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
29dc0 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
29dd0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
29de0 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
29df0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
29e00 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
29e10 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
29e20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29e30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29e40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
29e50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
29e60 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
29e70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
29e80 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
29e90 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
29ea0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
29eb0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
29ec0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
29ed0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
29ee0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
29ef0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
29f00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29f10 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
29f20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
29f30 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
29f40 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
29f50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
29f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29f70 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
29f80 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
29f90 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
29fa0 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
29fb0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
29fc0 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
29fd0 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
29fe0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29ff0 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
2a000 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
2a010 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
2a020 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
2a030 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2a040 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2a050 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
2a060 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
2a070 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2a080 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
2a090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a0a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
2a0b0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
2a0c0 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
2a0d0 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
2a0e0 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
2a0f0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
2a100 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
2a110 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
2a120 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
2a130 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
2a140 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
2a150 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2a160 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
2a170 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
2a180 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
2a190 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
2a1a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2a1b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
2a1c0 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
2a1d0 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
2a1e0 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
2a1f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
2a200 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2a210 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
2a220 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
2a230 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
2a240 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
2a250 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
2a260 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
2a270 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
2a280 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
2a290 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
2a2a0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2a2b0 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
2a2c0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
2a2d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a2e0 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
2a2f0 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
2a300 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
2a310 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
2a320 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
2a330 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
2a340 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
2a350 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
2a360 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
2a370 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
2a380 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
2a390 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
2a3a0 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
2a3b0 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
2a3c0 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
2a3d0 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
2a3e0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2a3f0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
2a400 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
2a410 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
2a420 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
2a430 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
2a440 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2a450 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
2a460 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
2a470 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
2a480 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
2a490 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
2a4a0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
2a4b0 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
2a4c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
2a4d0 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
2a4e0 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
2a4f0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2a500 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
2a510 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
2a520 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
2a530 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
2a540 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
2a550 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
2a560 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
2a570 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
2a580 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
2a590 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
2a5a0 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
2a5b0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
2a5c0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2a5d0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
2a5e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2a5f0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2a600 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
2a610 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2a620 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
2a630 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
2a640 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
2a650 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
2a660 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2a670 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2a680 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
2a690 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
2a6a0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
2a6b0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
2a6c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a6e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a6f0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
2a700 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
2a710 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
2a720 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
2a730 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
2a740 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
2a750 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2a770 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
2a780 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2a790 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
2a7a0 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
2a7b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2a7c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
2a7d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2a7e0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2a7f0 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  | pList->pDirty=
2a800 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
2a810 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54  LITE_SERVER_EDIT
2a820 49 4f 4e 0a 20 20 69 66 28 20 70 61 67 65 72 49  ION.  if( pagerI
2a830 73 53 65 72 76 65 72 28 70 50 61 67 65 72 29 20  sServer(pPager) 
2a840 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2a850 74 65 33 53 65 72 76 65 72 50 72 65 43 6f 6d 6d  te3ServerPreComm
2a860 69 74 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76  it(pPager->pServ
2a870 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 53 65 72  er, pPager->pSer
2a880 76 65 72 50 61 67 65 29 3b 0a 20 20 20 20 70 50  verPage);.    pP
2a890 61 67 65 72 2d 3e 70 53 65 72 76 65 72 50 61 67  ager->pServerPag
2a8a0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  e = 0;.    if( r
2a8b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a8c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2a8d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
2a8e0 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
2a8f0 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
2a900 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
2a910 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
2a920 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
2a930 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
2a940 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2a950 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
2a960 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
2a970 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
2a980 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
2a990 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
2a9a0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
2a9b0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2a9c0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
2a9d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
2a9e0 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
2a9f0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
2aa00 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
2aa10 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
2aa20 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
2aa30 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
2aa40 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
2aa50 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
2aa60 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
2aa70 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
2aa80 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
2aa90 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
2aaa0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2aab0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
2aac0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2aad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2aae0 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  K .   && pPager-
2aaf0 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67  >dbHintSize<pPag
2ab00 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26  er->dbSize.   &&
2ab10 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20   (pList->pDirty 
2ab20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70  || pList->pgno>p
2ab30 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2ab40 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e).  ){.    sqli
2ab50 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
2ab60 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
2ab70 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
2ab80 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
2ab90 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
2aba0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
2abb0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
2abc0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
2abd0 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
2abe0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
2abf0 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
2ac00 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
2ac10 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2ac20 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2ac30 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
2ac40 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
2ac50 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
2ac60 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
2ac70 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
2ac80 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
2ac90 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
2aca0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
2acb0 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
2acc0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
2acd0 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
2ace0 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
2acf0 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
2ad00 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
2ad10 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
2ad20 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
2ad30 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
2ad40 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
2ad50 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
2ad60 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
2ad70 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
2ad80 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
2ad90 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
2ada0 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
2adb0 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
2adc0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
2add0 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
2ade0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
2adf0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
2ae00 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
2ae10 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
2ae20 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
2ae30 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
2ae40 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
2ae50 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
2ae60 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
2ae70 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2ae80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
2aeb0 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
2aec0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
2aed0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
2aee0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2aef0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
2af00 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
2af10 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
2af20 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
2af30 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
2af40 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2af50 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2af60 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
2af70 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
2af80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2af90 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  PT, pData);..   
2afa0 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
2afb0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
2afc0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2afd0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2afe0 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
2aff0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2b000 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
2b010 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
2b020 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
2b030 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
2b040 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
2b050 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
2b060 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
2b070 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2b080 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
2b090 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
2b0a0 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
2b0b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2b0c0 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
2b0d0 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
2b0e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
2b0f0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
2b100 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2b110 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
2b120 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
2b130 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2b140 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
2b150 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
2b160 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2b170 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2b180 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
2b190 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
2b1a0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
2b1b0 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
2b1c0 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  E]++;..      /* 
2b1d0 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
2b1e0 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
2b1f0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2b200 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
2b210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
2b220 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
2b230 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
2b240 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
2b250 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
2b260 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
2b270 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
2b280 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
2b2a0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2b2b0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
2b2c0 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
2b2d0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
2b2e0 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
2b2f0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
2b300 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
2b310 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2b320 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
2b330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
2b340 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
2b350 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
2b360 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b370 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
2b380 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
2b390 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
2b3a0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
2b3b0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
2b3c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b3d0 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
2b3e0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b3f0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
2b400 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
2b410 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
2b420 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2b430 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
2b440 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2b450 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
2b460 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
2b470 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
2b480 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
2b490 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2b4a0 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
2b4b0 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
2b4c0 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
2b4d0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
2b4e0 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
2b4f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2b500 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b510 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2b520 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2b530 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
2b540 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  gs =  SQLITE_OPE
2b550 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53  N_SUBJOURNAL | S
2b560 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2b570 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51  RITE .      | SQ
2b580 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2b590 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   | SQLITE_OPEN_E
2b5a0 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20  XCLUSIVE .      
2b5b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
2b5c0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20  LETEONCLOSE;.   
2b5d0 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20   int nStmtSpill 
2b5e0 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
2b5f0 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20  nStmtSpill;.    
2b600 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2b610 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2b620 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2b630 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
2b640 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2b650 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20     nStmtSpill = 
2b660 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  -1;.    }.    rc
2b670 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
2b680 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  lOpen(pPager->pV
2b690 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73  fs, 0, pPager->s
2b6a0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d  jfd, flags, nStm
2b6b0 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  tSpill);.  }.  r
2b6c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b6d0 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
2b6e0 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
2b6f0 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
2b700 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
2b710 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49  ournal. .**.** I
2b720 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
2b730 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
2b740 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
2b750 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
2b760 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
2b770 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
2b780 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2b790 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2b7a0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2b7b0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2b7c0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2b7d0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
2b7e0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
2b7f0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
2b800 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2b810 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2b820 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2b830 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
2b840 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
2b850 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
2b860 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
2b870 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2b880 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
2b890 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
2b8a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b8b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2b8c0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2b8d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2b8e0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
2b8f0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
2b900 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
2b910 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
2b920 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
2b930 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
2b940 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b950 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2b960 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
2b970 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2b980 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
2b990 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2b9a0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2b9b0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2b9c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
2b9d0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2b9e0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2b9f0 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
2ba00 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
2ba10 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67  rnal(pPager, pPg
2ba20 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2ba30 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2ba40 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2ba50 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
2ba60 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
2ba70 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
2ba80 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2ba90 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
2baa0 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
2bab0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
2bac0 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
2bad0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
2bae0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
2baf0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2bb00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bb10 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2bb20 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
2bb30 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
2bb40 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  64)pPager->nSubR
2bb50 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
2bb60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
2bb70 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23 69  har *pData2;..#i
2bb80 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2bb90 45 43 20 20 20 0a 20 20 20 20 20 20 69 66 28 20  EC   .      if( 
2bba0 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d  !pPager->subjInM
2bbb0 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20  emory ){.       
2bbc0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2bbd0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
2bbe0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
2bbf0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
2bc00 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 7d 65  Data2);.      }e
2bc10 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2bc20 20 70 44 61 74 61 32 20 3d 20 70 44 61 74 61 3b   pData2 = pData;
2bc30 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2bc40 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
2bc50 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2bc60 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2bc70 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2bc80 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2bc90 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
2bca0 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
2bcb0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2bcc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bcd0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2bce0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2bcf0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
2bd00 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
2bd10 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
2bd20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bd30 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2bd40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2bd50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
2bd60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2bd70 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
2bd80 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
2bd90 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2bda0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2bdb0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
2bdc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2bdd0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2bde0 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50  PageIfRequired(P
2bdf0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
2be00 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2be10 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72  ge(pPg) ){.    r
2be20 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c  eturn subjournal
2be30 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
2be40 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
2be50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
2be60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2be70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2be80 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
2be90 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
2bea0 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
2beb0 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
2bec0 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
2bed0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
2bee0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
2bef0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
2bf00 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
2bf10 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
2bf20 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
2bf30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
2bf40 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
2bf50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
2bf60 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2bf70 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
2bf80 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
2bf90 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
2bfa0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2bfb0 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
2bfc0 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
2bfd0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2bfe0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
2bff0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
2c000 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
2c010 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
2c020 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2c030 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
2c040 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
2c050 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
2c060 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2c070 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
2c080 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
2c090 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
2c0a0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2c0b0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
2c0c0 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
2c0d0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2c0e0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
2c0f0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
2c100 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2c110 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2c120 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2c130 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
2c140 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
2c150 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2c160 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2c170 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
2c180 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
2c190 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
2c1a0 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
2c1b0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2c1c0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
2c1d0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
2c1e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2c1f0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
2c200 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
2c210 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
2c220 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
2c230 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2c240 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
2c250 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
2c260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2c270 69 66 28 20 70 61 67 65 72 49 73 53 65 72 76 65  if( pagerIsServe
2c280 72 28 70 50 61 67 65 72 29 20 29 20 72 65 74 75  r(pPager) ) retu
2c290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
2c2a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2c2b0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2c2c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
2c2d0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2c2e0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
2c2f0 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
2c300 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e  bit is set durin
2c310 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2c320 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2c330 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2c340 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2c350 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2c360 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2c370 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2c380 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2c390 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2c3a0 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2c3b0 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2c3c0 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2c3d0 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2c3e0 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2c3f0 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c  e doNotSpill ROL
2c400 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69  LBACK and OFF bi
2c410 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ts inhibits all 
2c420 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20  cache spilling. 
2c430 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f   ** regardless o
2c440 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
2c450 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2c460 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2c470 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20  t during.  ** a 
2c480 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75  rollback or by u
2c490 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73  ser request, res
2c4a0 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a  pectively..  **.
2c4b0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
2c4c0 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
2c4d0 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
2c4e0 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
2c4f0 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
2c500 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
2c510 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
2c520 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
2c530 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20  ementation it . 
2c540 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
2c550 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61  e for sqlite3Pca
2c560 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
2c570 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
2c580 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20  ateFlag==3.  ** 
2c590 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
2c5a0 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
2c5b0 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
2c5c0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2c5d0 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
2c5e0 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
2c5f0 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
2c600 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
2c610 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
2c620 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
2c630 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
2c640 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
2c650 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
2c660 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2c670 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2c680 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
2c690 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73  TE_OK;.  testcas
2c6a0 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2c6b0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2c6c0 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  G_ROLLBACK );.  
2c6d0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2c6e0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2c6f0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a  PILLFLAG_OFF );.
2c700 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2c710 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2c720 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
2c730 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  C );.  if( pPage
2c740 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20  r->doNotSpill.  
2c750 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f   && ((pPager->do
2c760 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c  NotSpill & (SPIL
2c770 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53  LFLAG_ROLLBACK|S
2c780 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d  PILLFLAG_OFF))!=
2c790 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  0.      || (pPg-
2c7a0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
2c7b0 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20  EED_SYNC)!=0).  
2c7c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c7d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2c7e0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
2c7f0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
2c800 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
2c810 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
2c820 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
2c830 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
2c840 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
2c850 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2c860 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a  Required(pPg); .
2c870 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2c890 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
2c8a0 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
2c8b0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2c8c0 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
2c8d0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
2c8e0 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
2c8f0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
2c900 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2c910 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
2c920 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2c930 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
2c940 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
2c950 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
2c960 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
2c970 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2c980 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
2c990 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2c9a0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2c9b0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2c9c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c9d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2c9e0 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
2c9f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2ca00 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
2ca10 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2ca20 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
2ca30 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2ca40 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
2ca50 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
2ca60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ca70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
2ca80 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
2ca90 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2caa0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2cab0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2cac0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2cad0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
2cae0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
2caf0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2cb00 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rc); .}../*.** F
2cb10 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72  lush all unrefer
2cb20 65 6e 63 65 64 20 64 69 72 74 79 20 70 61 67 65  enced dirty page
2cb30 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  s to disk..*/.in
2cb40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c  t sqlite3PagerFl
2cb50 75 73 68 28 50 61 67 65 72 20 2a 70 50 61 67 65  ush(Pager *pPage
2cb60 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  r){.  int rc = p
2cb70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2cb80 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
2cb90 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74      PgHdr *pList
2cba0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2cbb0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2cbc0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
2cbd0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
2cbe0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
2cbf0 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  r) );.    while(
2cc00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2cc10 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  & pList ){.     
2cc20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
2cc30 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2cc40 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
2cc50 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
2cc60 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 72     rc = pagerStr
2cc70 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65  ess((void*)pPage
2cc80 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r, pList);.     
2cc90 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d   }.      pList =
2cca0 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20   pNext;.    }.  
2ccb0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2ccc0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2ccd0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2cce0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
2ccf0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
2cd00 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
2cd10 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
2cd20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
2cd30 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
2cd40 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
2cd50 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
2cd60 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
2cd70 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
2cd80 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
2cd90 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
2cda0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
2cdb0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
2cdc0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
2cdd0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
2cde0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2cdf0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
2ce00 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
2ce10 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
2ce20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
2ce30 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
2ce40 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
2ce50 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
2ce60 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
2ce70 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
2ce80 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
2ce90 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
2cea0 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
2ceb0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
2cec0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
2ced0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2cee0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
2cef0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2cf00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
2cf10 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
2cf20 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
2cf30 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
2cf40 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
2cf50 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
2cf60 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2cf70 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
2cf80 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2cf90 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
2cfa0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
2cfb0 74 72 61 28 29 20 41 50 49 2e 20 20 57 68 65 6e  tra() API.  When
2cfc0 20 61 20 6e 65 77 20 70 61 67 65 20 69 73 20 61   a new page is a
2cfd0 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a 2a 2a  llocated, the.**
2cfe0 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
2cff0 66 20 74 68 69 73 20 73 70 61 63 65 20 61 72 65  f this space are
2d000 20 7a 65 72 6f 65 64 20 62 75 74 20 74 68 65 20   zeroed but the 
2d010 72 65 6d 61 69 6e 64 65 72 20 69 73 20 75 6e 69  remainder is uni
2d020 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28  nitialized..** (
2d030 54 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  The extra space 
2d040 69 73 20 75 73 65 64 20 62 79 20 62 74 72 65 65  is used by btree
2d050 20 61 73 20 74 68 65 20 4d 65 6d 50 61 67 65 20   as the MemPage 
2d060 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54  object.).**.** T
2d070 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2d080 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2d090 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2d0a0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2d0b0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2d0c0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2d0d0 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2d0e0 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2d0f0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2d100 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2d110 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2d120 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2d130 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2d140 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2d150 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2d160 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2d170 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2d180 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2d190 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2d1a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2d1b0 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2d1c0 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2d1d0 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2d1e0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2d1f0 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2d200 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2d210 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2d220 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2d230 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2d240 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2d250 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2d260 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2d270 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2d280 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2d290 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2d2a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2d2b0 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2d2c0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2d2d0 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2d2e0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2d2f0 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2d300 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2d310 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2d320 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2d330 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2d340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2d350 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2d360 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2d370 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2d380 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2d390 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2d3a0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2d3b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2d3c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2d3d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2d3e0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2d3f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2d400 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2d410 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2d420 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2d430 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2d440 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2d450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2d460 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2d470 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2d480 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2d490 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2d4a0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2d4b0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2d4c0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2d4d0 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2d4e0 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2d4f0 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2d500 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2d510 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2d520 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2d530 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2d540 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2d550 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2d560 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d570 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2d580 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2d590 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2d5a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2d5b0 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2d5c0 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2d5d0 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2d5e0 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2d5f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2d600 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2d610 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2d620 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2d630 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d640 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2d650 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2d660 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2d670 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2d680 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2d690 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2d6a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2d6b0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2d6c0 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2d6d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2d6e0 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2d6f0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2d700 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2d710 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2d720 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2d730 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2d740 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2d750 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2d760 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2d770 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2d780 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2d790 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2d7a0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2d7b0 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2d7c0 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2d7d0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2d7e0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2d7f0 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2d800 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2d810 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2d820 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2d830 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2d840 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2d850 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2d860 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2d870 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2d880 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2d890 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2d8a0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2d8b0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2d8c0 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2d8d0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2d8e0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2d8f0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2d900 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20  journal).  */.  
2d910 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d920 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2d930 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2d940 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ));..  /* Set th
2d950 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2d960 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2d970 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2d980 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2d990 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2d9a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2d9b0 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2d9c0 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2d9d0 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2d9e0 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2d9f0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2da00 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2da10 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2da20 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2da30 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2da40 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2da50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2da60 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2da70 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2da80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2da90 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2daa0 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2dab0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2dac0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2dad0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2dae0 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2daf0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2db00 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2db10 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2db20 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2db30 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2db40 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2db50 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2db60 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2db70 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2db80 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2db90 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2dba0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2dbb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2dbc0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2dbd0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2dbe0 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2dbf0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2dc00 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2dc10 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2dc20 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2dc30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dc40 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2dc50 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2dc60 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2dc70 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2dc80 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2dc90 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2dca0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2dcb0 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2dcc0 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2dcd0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2dce0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2dcf0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2dd00 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2dd10 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2dd20 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2dd30 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2dd40 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2dd50 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2dd60 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2dd70 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2dd80 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2dd90 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2dda0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2ddb0 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d   = (int)(&z[1] -
2ddc0 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65   zUri);.    asse
2ddd0 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20  rt( nUri>=0 );. 
2dde0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ddf0 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
2de00 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
2de10 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
2de20 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2de30 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
2de40 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
2de50 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2de60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2de70 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
2de80 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
2de90 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
2dea0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
2deb0 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
2dec0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2ded0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
2dee0 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
2def0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
2df00 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
2df10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2df20 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
2df30 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
2df40 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
2df50 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
2df60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2df70 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2df80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2df90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2dfa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2dfb0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2dfc0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2dfd0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
2dfe0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
2dff0 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
2e000 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
2e010 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
2e020 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
2e030 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
2e040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e050 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
2e060 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
2e070 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
2e080 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
2e090 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
2e0a0 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
2e0b0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2e0c0 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
2e0d0 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
2e0e0 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
2e0f0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2e100 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
2e110 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
2e120 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2e130 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
2e140 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
2e150 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
2e160 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
2e170 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2e180 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
2e190 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2e1a0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
2e1b0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
2e1c0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
2e1d0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2e1e0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2e1f0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2e210 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
2e220 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
2e230 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
2e240 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2e250 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
2e260 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
2e270 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
2e280 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
2e290 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2e2a0 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
2e2b0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
2e2c0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
2e2d0 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
2e2e0 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
2e2f0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
2e300 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2e310 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
2e320 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
2e330 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
2e340 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
2e350 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
2e360 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2e370 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
2e380 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20  + 1 + nUri +    
2e390 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2e3a0 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
2e3b0 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20  me + 8 + 2      
2e3c0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
2e3d0 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
2e3e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2e3f0 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
2e400 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   4 + 2          
2e410 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2e420 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2e430 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2e440 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2e450 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2e460 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2e470 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2e480 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e490 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2e4a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e4b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2e4c0 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2e4d0 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2e4e0 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2e4f0 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2e500 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2e510 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2e520 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2e530 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2e540 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2e550 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2e560 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2e570 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2e580 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2e590 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2e5a0 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2e5b0 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2e5c0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2e5d0 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2e5e0 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2e5f0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2e600 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2e610 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2e620 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2e630 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2e640 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2e650 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2e660 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2e670 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2e680 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2e690 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2e6a0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2e6b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2e6c0 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2e6d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2e6e0 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2e6f0 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2e700 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2e710 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2e720 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2e730 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2e740 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2e750 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2e760 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2e770 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2e780 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2e790 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2e7a0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2e7b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2e7c0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2e7d0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2e7e0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2e7f0 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2e800 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2e810 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e820 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2e830 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2e840 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2e850 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2e860 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2e870 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2e880 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2e890 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2e8a0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2e8b0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2e8c0 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2e8d0 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2e8e0 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2e8f0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2e900 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2e910 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2e920 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2e930 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2e940 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2e950 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2e960 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2e970 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2e980 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2e990 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2e9a0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2e9b0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2e9c0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2e9d0 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e9f0 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2ea00 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2ea10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ea20 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2ea30 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2ea40 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2ea50 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2ea60 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2ea70 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  b );.    readOnl
2ea80 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2ea90 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2eaa0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2eab0 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2eac0 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2ead0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2eae0 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2eaf0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2eb00 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2eb10 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2eb20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2eb30 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2eb40 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2eb50 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2eb60 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2eb70 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2eb80 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2eb90 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2eba0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2ebb0 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2ebc0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2ebd0 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2ebe0 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2ebf0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2ec00 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2ec10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2ec20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ec30 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2ec40 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2ec50 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2ec60 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >fd);.      if( 
2ec70 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2ec80 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
2ec90 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
2eca0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2ecb0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2ecc0 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
2ecd0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2ece0 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  E);.        if( 
2ecf0 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
2ed00 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
2ed10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ed20 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2ed30 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
2ed40 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
2ed50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2ed60 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2ed70 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2ed80 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2ed90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eda0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2edb0 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2edc0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2edd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ede0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2edf0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2ee00 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
2ee10 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
2ee20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ee30 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2ee40 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2ee50 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2ee60 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2ee70 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
2ee80 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
2ee90 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2eea0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2eeb0 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2eec0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2eed0 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2eee0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2eef0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2ef00 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2ef10 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
2ef20 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2ef30 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50               szP
2ef50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
2ef60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ef70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ef80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
2ef90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
2efa0 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  oLock = sqlite3_
2efb0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2efc0 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c  ename, "nolock",
2efd0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28   0);.      if( (
2efe0 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43  iDc & SQLITE_IOC
2eff0 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30  AP_IMMUTABLE)!=0
2f000 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
2f010 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2f020 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74  Filename, "immut
2f030 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20  able", 0) ){.   
2f040 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20         vfsFlags 
2f050 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
2f060 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
2f070 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65     goto act_like
2f080 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20  _temp_file;.    
2f090 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2f0a0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2f0b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2f0c0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2f0d0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2f0e0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2f0f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2f100 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2f110 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2f120 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2f130 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2f140 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2f150 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2f160 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2f170 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2f180 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2f190 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2f1a0 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2f1b0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2f1c0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2f1d0 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2f1e0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2f1f0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2f200 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2f210 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2f220 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2f230 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rnal..    **.   
2f240 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2f250 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69  also runs for fi
2f260 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d  les marked as im
2f270 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20  mutable..    */ 
2f280 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66  .act_like_temp_f
2f290 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c  ile:.    tempFil
2f2a0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
2f2b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2f2c0 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a  R_READER;     /*
2f2d0 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65   Pretend we alre
2f2e0 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20  ady have a lock 
2f2f0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
2f300 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2f310 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65  _LOCK;    /* Pre
2f320 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45  tend we are in E
2f330 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f  XCLUSIVE mode */
2f340 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  .    pPager->noL
2f350 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ock = 1;        
2f360 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2f370 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
2f380 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
2f390 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2f3a0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
2f3b0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2f3c0 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
2f3d0 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
2f3e0 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
2f3f0 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
2f400 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
2f410 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
2f420 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
2f430 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
2f440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f450 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2f460 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
2f470 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2f480 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
2f490 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
2f4a0 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
2f4b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2f4c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2f4d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
2f4e0 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
2f4f0 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66   object. */.  if
2f500 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f510 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  ){.    nExtra = 
2f520 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
2f530 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
2f540 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61 3c  ra>=8 && nExtra<
2f550 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  1000 );.    rc =
2f560 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
2f570 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
2f580 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5a0 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
2f5b0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
2f5c0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
2f5d0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2f5e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
2f5f0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ror occurred abo
2f600 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61  ve, free the  Pa
2f610 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
2f620 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
2f630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
2f640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f650 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2f660 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2f670 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
2f680 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
2f690 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
2f6a0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2f6b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f6c0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2f6d0 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2f6e0 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2f6f0 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2f700 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2f710 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2f720 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2f730 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2f740 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2f750 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2f760 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2f770 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2f780 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2f790 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2f7a0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2f7b0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2f7c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f7d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2f7e0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f7f0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2f800 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f810 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2f820 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2f830 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2f840 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2f850 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2f860 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
2f870 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
2f880 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
2f890 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
2f8a0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
2f8b0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
2f8c0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2f8d0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
2f8e0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
2f8f0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2f900 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2f910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2f920 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2f930 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
2f940 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2f950 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
2f960 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
2f970 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2f980 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
2f990 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2f9a0 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
2f9b0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
2f9c0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
2f9d0 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20  Only;.  assert( 
2f9e0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
2f9f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2fa00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
2fa10 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
2fa20 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
2fa30 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2fa40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2fa50 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29  r->fullSync==0 )
2fa60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2fa70 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d  ager->extraSync=
2fa80 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2fa90 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ( pPager->syncFl
2faa0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2fab0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61  sert( pPager->wa
2fac0 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  lSyncFlags==0 );
2fad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2fae0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2faf0 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  gs==0 );.  }else
2fb00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  {.    pPager->fu
2fb10 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  llSync = 1;.    
2fb20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
2fb30 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
2fb40 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
2fb50 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2fb60 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  L;.    pPager->w
2fb70 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  alSyncFlags = SQ
2fb80 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2fb90 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e   | WAL_SYNC_TRAN
2fba0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50  SACTIONS;.    pP
2fbb0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2fbc0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2fbd0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
2fbe0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2fbf0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2fc00 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2fc10 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2fc20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2fc30 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2fc40 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2fc50 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2fc60 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2fc70 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2fc80 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2fc90 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2fca0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2fcb0 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2fcc0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2fcd0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2fce0 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2fcf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2fd00 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2fd10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2fd20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
2fd30 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
2fd40 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2fd50 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2fd60 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
2fd70 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
2fd80 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
2fd90 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
2fda0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
2fdb0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2fdc0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
2fdd0 6e 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65 72  nit;.  setGetter
2fde0 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a  Method(pPager);.
2fdf0 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2fe00 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2fe10 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2fe20 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  sh)); */.  /* pP
2fe30 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53  ager->szMmap = S
2fe40 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
2fe50 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20  AP_SIZE // will 
2fe60 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e  be set by btree.
2fe70 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72  c */..  *ppPager
2fe80 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
2fe90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2fea0 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
2feb0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
2fec0 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64  ile has not be d
2fed0 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65  eleted or rename
2fee0 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e  d out from.** un
2fef0 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20  der the pager.  
2ff00 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2ff10 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ff20 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69   is still were i
2ff30 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65  t ought.** to be
2ff40 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72   on disk.  Retur
2ff50 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49  n non-zero (SQLI
2ff60 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
2ff70 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  VED or some othe
2ff80 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  r error.** code 
2ff90 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63  from sqlite3OsAc
2ffa0 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64  cess()) if the d
2ffb0 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65  atabase has gone
2ffc0 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   missing..*/.sta
2ffd0 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
2ffe0 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20  IsUnmoved(Pager 
2fff0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30000 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  bHasMoved = 0;. 
30010 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
30020 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30030 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
30040 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
30050 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72  r->dbSize==0 ) r
30060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30070 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30080 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  r->zFilename && 
30090 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
300a0 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73  e[0] );.  rc = s
300b0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
300c0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
300d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
300e0 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76  _MOVED, &bHasMov
300f0 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ed);.  if( rc==S
30100 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
30110 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
30120 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63  HAS_MOVED file-c
30130 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c  ontrol is unimpl
30140 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20  emented, assume 
30150 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20  that the file.  
30160 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
30170 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69  n moved.  That i
30180 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c  s the historical
30190 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c   behavior of SQL
301a0 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20  ite: prior to.  
301b0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38    ** version 3.8
301c0 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65  .3, it never che
301d0 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d  cked */.    rc =
301e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
301f0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
30200 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76  TE_OK && bHasMov
30210 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
30220 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
30230 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65  BMOVED;.  }.  re
30240 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
30250 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
30260 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
30270 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
30280 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
30290 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
302a0 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
302b0 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
302c0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
302d0 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
302e0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
302f0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
30300 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
30310 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
30320 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
30330 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
30340 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
30350 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
30360 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
30370 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
30380 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
30390 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
303a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
303b0 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
303c0 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
303d0 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
303e0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
303f0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
30400 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30410 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
30420 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
30430 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
30440 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
30450 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
30460 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
30470 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
30480 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
30490 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
304a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
304b0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
304c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
304d0 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
304e0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
304f0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
30500 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
30510 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
30520 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
30530 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
30540 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
30550 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
30560 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
30570 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
30580 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
30590 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
305a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
305b0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
305c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
305d0 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
305e0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
305f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
30600 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
30610 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
30620 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
30630 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
30640 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
30650 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
30660 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
30670 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
30680 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
30690 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
306a0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
306b0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
306c0 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
306d0 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
306e0 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
306f0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
30700 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
30710 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
30720 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
30730 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
30740 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
30750 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
30760 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
30770 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
30780 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
30790 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
307a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
307b0 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
307c0 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
307d0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
307e0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
307f0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
30800 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
30810 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
30820 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
30830 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
30840 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
30850 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
30860 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
30870 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
30880 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
30890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
308a0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
308b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
308c0 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
308d0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
308e0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
308f0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
30900 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30910 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30920 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
30930 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
30940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
30950 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
30960 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
30970 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
30980 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
30990 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
309a0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
309b0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
309c0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
309d0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
309e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
309f0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
30a00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e  ;..  assert( jrn
30a10 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71  lOpen==0 || ( sq
30a20 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
30a30 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
30a40 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20  ger->jfd) &.    
30a50 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
30a60 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
30a70 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78  EN.  ));..  *pEx
30a80 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  ists = 0;.  if( 
30a90 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
30aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
30ab0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
30ac0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
30ad0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
30ae0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
30af0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
30b00 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
30b10 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
30b20 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
30b30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
30b40 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
30b50 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
30b60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
30b70 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
30b80 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
30b90 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
30ba0 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
30bb0 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
30bc0 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
30bd0 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
30be0 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
30bf0 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
30c00 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
30c10 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
30c20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
30c30 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
30c40 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
30c50 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
30c60 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
30c70 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
30c80 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
30c90 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
30ca0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
30cb0 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
30cc0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
30cd0 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
30ce0 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
30cf0 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
30d00 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
30d10 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
30d20 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
30d30 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
30d40 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
30d50 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
30d60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
30d70 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
30d80 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
30d90 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
30da0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30db0 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
30dc0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  {.      Pgno nPa
30dd0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
30de0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30df0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
30e00 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
30e10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30e20 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b  ->tempFile==0 );
30e30 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
30e40 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
30e50 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
30e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
30e80 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
30e90 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20  e is zero pages 
30ea0 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65  in size, that me
30eb0 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
30ec0 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20  (1) the.        
30ed0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20  ** journal is a 
30ee0 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70  remnant from a p
30ef0 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69  rior database wi
30f00 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
30f10 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a   where.        *
30f20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
30f30 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20  ile but not the 
30f40 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65  journal was dele
30f50 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20  ted, or (2) the 
30f60 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20  initial.        
30f70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
30f80 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20  hat populates a 
30f90 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
30fa0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
30fb0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  k..        ** In
30fc0 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
30fd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
30fe0 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  an be deleted.  
30ff0 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61  However, take ca
31000 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  re.        ** no
31010 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
31020 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
31030 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
31040 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20  en due to.      
31050 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64    ** journal_mod
31060 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20  e=PERSIST..     
31070 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
31080 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a  ( nPage==0 && !j
31090 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
310a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
310b0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
310c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
310d0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
310e0 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
310f0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
31100 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31110 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
31120 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
31130 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
31140 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
31150 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
31160 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
31170 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31180 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
31190 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
311a0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
311b0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
311c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
311d0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
311e0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
311f0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
31200 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
31210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
31220 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
31230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31240 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
31250 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
31260 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
31270 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
31280 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
31290 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
312a0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
312b0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
312c0 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
312d0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
312e0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
312f0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
31300 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
31310 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
31320 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
31330 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
31340 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
31350 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
31360 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
31370 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
31380 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31390 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
313a0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
313b0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
313c0 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
313d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
313e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
313f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31400 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
31410 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31420 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
31430 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
31440 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
31450 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
31470 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
31480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
31490 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
314a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
314b0 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
314c0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
314d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
314e0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
314f0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
31500 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
31510 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
31520 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
31530 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
31540 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
31550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31560 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
31570 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
31580 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
31590 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
315a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
315b0 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
315c0 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
315d0 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
315e0 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
315f0 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
31600 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
31610 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
31620 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
31630 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
31640 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
31650 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
31660 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
31670 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
31680 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
31690 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
316a0 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
316b0 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
316c0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
316d0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
316e0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
316f0 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
31700 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
31710 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31720 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
31730 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
31740 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
31750 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
31760 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
31770 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
31780 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
31790 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
317a0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
317b0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
317c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
317d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
317e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
317f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
31800 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
31810 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44  SQLITE_SERVER_ED
31820 49 54 49 4f 4e 0a 73 74 61 74 69 63 20 69 6e 74  ITION.static int
31830 20 70 61 67 65 72 53 65 72 76 65 72 43 6f 6e 6e   pagerServerConn
31840 65 63 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ect(Pager *pPage
31850 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
31860 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
31870 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31880 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
31890 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20  r->noLock = 1;. 
318a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
318b0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
318c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
318d0 53 54 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ST;.    rc = sql
318e0 69 74 65 33 53 65 72 76 65 72 43 6f 6e 6e 65 63  ite3ServerConnec
318f0 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
31900 72 2d 3e 70 53 65 72 76 65 72 29 3b 0a 20 20 7d  r->pServer);.  }
31910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31920 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31930 72 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c  rRollbackJournal
31940 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
31950 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
31960 66 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  fd){.  int rc;  
31970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31980 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
31990 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   Code */.  sqlit
319a0 65 33 5f 66 69 6c 65 20 2a 73 61 76 65 64 5f 6a  e3_file *saved_j
319b0 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64  fd = pPager->jfd
319c0 3b 0a 20 20 75 38 20 73 61 76 65 64 5f 65 53 74  ;.  u8 saved_eSt
319d0 61 74 65 20 3d 20 70 50 61 67 65 72 2d 3e 65 53  ate = pPager->eS
319e0 74 61 74 65 3b 0a 20 20 75 38 20 73 61 76 65 64  tate;.  u8 saved
319f0 5f 65 4c 6f 63 6b 20 3d 20 70 50 61 67 65 72 2d  _eLock = pPager-
31a00 3e 65 4c 6f 63 6b 3b 0a 20 20 69 36 34 20 73 61  >eLock;.  i64 sa
31a10 76 65 64 5f 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  ved_journalOff =
31a20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31a30 4f 66 66 3b 0a 20 20 69 36 34 20 73 61 76 65 64  Off;.  i64 saved
31a40 5f 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  _journalHdr = pP
31a50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
31a60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
31a70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
31a80 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31a90 4f 44 45 5f 50 45 52 53 49 53 54 20 29 3b 0a 0a  ODE_PERSIST );..
31aa0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
31ab0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
31ac0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
31ad0 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
31ae0 52 5f 44 42 4d 4f 44 3b 0a 20 20 70 50 61 67 65  R_DBMOD;.  pPage
31af0 72 2d 3e 6a 66 64 20 3d 20 70 4a 66 64 3b 0a 20  r->jfd = pJfd;. 
31b00 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
31b10 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
31b20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
31b30 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 70 61  ITE_OK ) rc = pa
31b40 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
31b50 67 65 72 2c 20 31 29 3b 0a 0a 20 20 61 73 73 65  ger, 1);..  asse
31b60 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
31b70 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 70 50 61  r->jfd) );.  pPa
31b80 67 65 72 2d 3e 6a 66 64 20 3d 20 73 61 76 65 64  ger->jfd = saved
31b90 5f 6a 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e  _jfd;.  pPager->
31ba0 65 53 74 61 74 65 20 3d 20 73 61 76 65 64 5f 65  eState = saved_e
31bb0 53 74 61 74 65 3b 0a 20 20 70 50 61 67 65 72 2d  State;.  pPager-
31bc0 3e 65 4c 6f 63 6b 20 3d 20 73 61 76 65 64 5f 65  >eLock = saved_e
31bd0 4c 6f 63 6b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Lock;.  pPager->
31be0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 61 76  journalOff = sav
31bf0 65 64 5f 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  ed_journalOff;. 
31c00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31c10 48 64 72 20 3d 20 73 61 76 65 64 5f 6a 6f 75 72  Hdr = saved_jour
31c20 6e 61 6c 48 64 72 3b 0a 20 20 72 65 74 75 72 6e  nalHdr;.  return
31c30 20 72 63 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c   rc;.}..void sql
31c40 69 74 65 33 50 61 67 65 72 53 65 72 76 65 72 4a  ite3PagerServerJ
31c50 6f 75 72 6e 61 6c 28 0a 20 20 50 61 67 65 72 20  ournal(.  Pager 
31c60 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c 69  *pPager, .  sqli
31c70 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20  te3_file *jfd,. 
31c80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 6f   const char *zJo
31c90 75 72 6e 61 6c 0a 29 7b 0a 20 20 70 50 61 67 65  urnal.){.  pPage
31ca0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4a  r->zJournal = zJ
31cb0 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
31cc0 2d 3e 6a 66 64 20 3d 20 6a 66 64 3b 0a 7d 0a 0a  ->jfd = jfd;.}..
31cd0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
31ce0 61 67 65 72 53 65 72 76 65 72 43 6f 6e 6e 65 63  agerServerConnec
31cf0 74 28 70 50 61 67 65 72 29 20 53 51 4c 49 54 45  t(pPager) SQLITE
31d00 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  _OK.#endif.../*.
31d10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31d20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
31d30 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
31d40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
31d50 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
31d60 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
31d70 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  l sqlite3PagerGe
31d80 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20  t() until after 
31d90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
31da0 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
31db0 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49  sfully called. I
31dc0 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  f a shared-lock 
31dd0 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
31de0 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
31df0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
31e00 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
31e10 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
31e20 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ing operations a
31e30 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65  re also performe
31e40 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
31e50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  on..**.**   1) I
31e60 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
31e70 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
31e80 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f  R_OPEN state (no
31e90 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
31ea0 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
31eb0 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
31ec0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
31ed0 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
31ee0 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
31ef0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
31f00 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
31f10 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
31f20 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
31f30 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
31f40 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
31f50 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
31f60 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
31f70 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
31f80 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
31f90 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
31fa0 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
31fb0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
31fc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
31fd0 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
31fe0 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
31ff0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
32000 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
32010 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
32020 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
32030 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
32040 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
32050 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
32060 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
32070 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
32080 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
32090 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
320a0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
320b0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
320c0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
320d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
320e0 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
320f0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
32100 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
32110 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
32120 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
32130 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
32140 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
32150 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
32160 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
32170 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
32180 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
32190 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
321a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
321b0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
321c0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
321d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
321e0 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
321f0 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
32200 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
32210 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
32220 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
32230 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67  e or .** rolling
32240 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
32250 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72  file, the IO err
32260 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
32270 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
32280 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
32290 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
322a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
322b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
322c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
322d0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
322e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
322f0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
32300 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79   b-tree and only
32310 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
32320 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64  no.  ** outstand
32330 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
32340 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65  implies that the
32350 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68 6f   pager state sho
32360 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20  uld either.  ** 
32370 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45  be OPEN or READE
32380 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c  R. READER is onl
32390 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68  y possible if th
323a0 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77 61  e pager is or wa
323b0 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75  s in .  ** exclu
323c0 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
323d0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
323e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
323f0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
32400 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61  Cache)==0 );.  a
32410 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
32420 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
32430 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
32440 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32450 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61  AGER_OPEN || pPa
32460 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32470 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
32480 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32490 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
324a0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  K );..  if( !pag
324b0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
324c0 20 0a 20 20 20 26 26 20 21 70 61 67 65 72 49 73   .   && !pagerIs
324d0 53 65 72 76 65 72 28 70 50 61 67 65 72 29 20 0a  Server(pPager) .
324e0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53     && pPager->eS
324f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32500 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
32510 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
32520 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
32530 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
32540 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
32550 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
32560 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
32570 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
32580 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
32590 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
325a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
325b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
325c0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
325d0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
325e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
325f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32600 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32610 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
32620 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
32630 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
32640 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
32650 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
32660 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
32670 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
32680 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
32690 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
326a0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
326b0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
326c0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
326d0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
326e0 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
326f0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
32700 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
32710 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
32720 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
32730 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
32740 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
32750 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
32770 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
32780 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
32790 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
327a0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
327b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
327c0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
327d0 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
327e0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
327f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32800 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
32810 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32820 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
32830 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
32840 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
32850 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
32860 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
32870 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
32880 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
32890 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
328a0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
328b0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
328c0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
328d0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
328e0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
328f0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
32900 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
32910 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
32920 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
32930 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
32940 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
32950 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
32960 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
32970 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
32980 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
32990 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
329a0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
329b0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
329c0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
329d0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
329e0 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
329f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
32a00 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
32a10 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
32a20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
32a30 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
32a40 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
32a50 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
32a60 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
32a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32a80 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
32a90 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
32aa0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
32ab0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
32ac0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
32ad0 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
32ae0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
32af0 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
32b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32b10 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
32b20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32b30 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
32b40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
32b50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32b70 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32b80 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
32b90 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
32ba0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
32bb0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
32bc0 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
32bd0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
32be0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
32bf0 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
32c00 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
32c10 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
32c20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
32c30 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
32c40 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
32c50 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
32c60 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
32c70 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
32c80 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
32c90 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
32ca0 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
32cb0 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
32cc0 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
32cd0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
32ce0 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
32cf0 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
32d00 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
32d10 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
32d20 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
32d30 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
32d40 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
32d50 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
32d60 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
32d70 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
32d80 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
32d90 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
32da0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
32db0 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
32dc0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
32dd0 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
32de0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
32df0 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
32e00 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
32e10 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
32e20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
32e30 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
32e40 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
32e50 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
32e60 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
32e70 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
32e80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
32e90 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
32ea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32eb0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
32ec0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
32ed0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
32ee0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
32ef0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
32f00 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
32f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32f20 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
32f30 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
32f40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32f50 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
32f60 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
32f70 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
32f80 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32f90 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
32fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
32fc0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
32fd0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
32fe0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
32ff0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
33000 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
33010 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
33020 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
33030 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
33040 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
33050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33060 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
33070 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
33080 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
33090 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
330a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
330b0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
330c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
330d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
330e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
330f0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
33100 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
33110 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33120 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
33130 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
33140 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
33150 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
33160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33170 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
33180 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
33190 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
331a0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
331b0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
331c0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
331d0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
331e0 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
331f0 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
33200 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
33210 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
33220 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
33230 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
33240 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
33250 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
33260 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
33270 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
33280 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
33290 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
332a0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
332b0 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
332c0 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
332d0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
332e0 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
332f0 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
33300 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
33310 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
33320 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
33330 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
33340 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
33350 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
33360 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
33370 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
33380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
33390 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
333a0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
333b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
333c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
333d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
333e0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
333f0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50  back(pPager, !pP
33400 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
33410 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
33420 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
33430 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
33440 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
33450 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
33460 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
33470 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
33480 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
33490 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
334a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
334b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
334c0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
334d0 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
334e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
334f0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
33500 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
33510 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
33520 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
33530 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
33540 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
33550 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
33560 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
33570 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
33580 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
33590 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
335a0 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
335b0 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
335c0 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
335d0 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
335e0 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
335f0 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
33600 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
33610 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
33620 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
33630 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
33640 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
33650 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
33660 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
33670 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
33680 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
33690 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
336a0 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
336b0 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
336c0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
336d0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
336e0 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
336f0 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
33700 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
33710 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
33720 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
33730 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
33740 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
33750 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
33760 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
33770 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
33780 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
33790 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
337a0 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
337b0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
337c0 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
337d0 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
337e0 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
337f0 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
33800 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
33810 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
33820 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
33830 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
33840 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
33850 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
33860 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
33870 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
33880 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
33890 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
338a0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
338b0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
338c0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
338d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
338e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
338f0 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
33900 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
33910 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
33920 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
33930 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
33940 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
33950 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
33960 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
33970 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
33980 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
33990 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48   && pPager->hasH
339a0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b  eldSharedLock ){
339b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
339c0 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
339d0 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
339e0 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20   then check to. 
339f0 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74       ** see if t
33a00 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
33a10 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
33a20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
33a30 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20  has changed,.   
33a40 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20     ** flush the 
33a50 63 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48  cache.  The hasH
33a60 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c  eldSharedLock fl
33a70 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73  ag prevents this
33a80 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f   from.      ** o
33a90 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20  ccurring on the 
33aa0 76 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73  very first acces
33ab0 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20  s to a file, in 
33ac0 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a  order to save a.
33ad0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
33ae0 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69  unnecessary sqli
33af0 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c  te3OsRead() call
33b00 20 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70   at the start-up
33b10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33b20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
33b30 6e 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65  nges are detecte
33b40 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
33b50 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
33b60 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
33b70 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
33b80 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
33b90 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
33ba0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
33bb0 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
33bc0 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
33bd0 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
33be0 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
33bf0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
33c00 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
33c10 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
33c20 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
33c30 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
33c40 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
33c50 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
33c60 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
33c70 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
33c80 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
33c90 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
33ca0 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
33cb0 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
33cc0 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
33cd0 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
33ce0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
33cf0 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
33d00 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
33d10 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
33d20 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
33d30 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
33d40 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
33d50 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
33d60 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
33d70 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
33d80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33d90 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
33da0 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
33db0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33dc0 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
33dd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
33df0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
33e00 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
33e10 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
33e20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
33e30 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
33e40 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
33e50 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
33e60 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
33e70 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
33e80 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
33e90 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
33ea0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
33eb0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
33ec0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
33ed0 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ger);..        /
33ee0 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61  * Unmap the data
33ef0 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73  base file. It is
33f00 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65   possible that e
33f10 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
33f20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  s.        ** may
33f30 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20   have truncated 
33f40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33f50 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e  e and then exten
33f60 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20  ded it back.    
33f70 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72      ** to its or
33f80 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c  iginal size whil
33f90 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77  e this process w
33fa0 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  as not holding a
33fb0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
33fc0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
33fd0 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61  here may exist a
33fe0 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70   Pager.pMap mapp
33ff0 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
34000 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
34010 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  e the right size
34020 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75   but is not actu
34030 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69  ally valid. Avoi
34040 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  d this.        *
34050 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79  * possibility by
34060 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64   unmapping the d
34070 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  b here. */.     
34080 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
34090 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
340a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
340b0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
340c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
340d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
340e0 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
340f0 53 65 72 76 65 72 43 6f 6e 6e 65 63 74 28 70 50  ServerConnect(pP
34100 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
34110 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
34120 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
34130 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
34140 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
34150 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
34160 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
34170 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
34180 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
34190 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
341a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
341b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
341c0 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
341d0 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  sent(pPager);.  
341e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
341f0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
34200 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34210 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  pWal==0 || rc==S
34220 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64  QLITE_OK );.#end
34230 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  if.  }..#ifdef S
34240 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49  QLITE_SERVER_EDI
34250 54 49 4f 4e 0a 20 20 69 66 28 20 70 61 67 65 72  TION.  if( pager
34260 49 73 53 65 72 76 65 72 28 70 50 61 67 65 72 29  IsServer(pPager)
34270 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
34280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
34290 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
342a0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
342b0 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  t(pPager)==0 );.
342c0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
342d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20  pPager);.    rc 
342e0 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 42  = sqlite3ServerB
342f0 65 67 69 6e 28 70 50 61 67 65 72 2d 3e 70 53 65  egin(pPager->pSe
34300 72 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  rver);.    if( r
34310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
34320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34330 33 53 65 72 76 65 72 4c 6f 63 6b 28 70 50 61 67  3ServerLock(pPag
34340 65 72 2d 3e 70 53 65 72 76 65 72 2c 20 31 2c 20  er->pServer, 1, 
34350 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
34360 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
34370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
34380 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34390 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
343a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
343b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
343c0 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
343d0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
343e0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
343f0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26  ->tempFile==0 &&
34400 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34410 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72  =PAGER_OPEN && r
34420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34430 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
34440 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
34450 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  &pPager->dbSize)
34460 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
34470 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34480 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
34490 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
344a0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
344b0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
344c0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
344d0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
344e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
344f0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
34500 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
34510 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
34520 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a  SharedLock = 1;.
34530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
34540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
34550 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
34560 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
34570 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
34580 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
34590 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
345a0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
345b0 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
345c0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
345d0 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
345e0 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
345f0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
34600 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
34610 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
34620 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
34630 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
34640 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
34650 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
34660 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
34670 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
34680 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
34690 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
346a0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
346b0 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50  ==0 && (sqlite3P
346c0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
346d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
346e0 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
346f0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
34700 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
34710 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
34720 67 65 74 74 65 72 20 6d 65 74 68 6f 64 73 20 65  getter methods e
34730 61 63 68 20 74 72 79 20 74 6f 20 61 63 71 75 69  ach try to acqui
34740 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
34750 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77 69 74 68  o a.** page with
34760 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
34770 6f 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  o. If the reques
34780 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
34790 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
347a0 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
347b0 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
347c0 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
347d0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
347e0 2a 20 54 68 65 72 65 20 61 72 65 20 64 69 66 66  * There are diff
347f0 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  erent implementa
34800 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 67 65 74  tions of the get
34810 74 65 72 20 6d 65 74 68 6f 64 20 64 65 70 65 6e  ter method depen
34820 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  ding.** on the c
34830 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
34840 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
34850 20 20 20 20 20 67 65 74 50 61 67 65 4e 6f 72 6d       getPageNorm
34860 61 6c 28 29 20 20 20 20 20 20 20 20 20 2d 2d 20  al()         -- 
34870 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74   The normal gett
34880 65 72 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  er.**     getPag
34890 65 45 72 72 6f 72 28 29 20 20 20 20 20 20 20 20  eError()        
348a0 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20 74 68    --  Used if th
348b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
348c0 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20   error state.** 
348d0 20 20 20 20 67 65 74 50 61 67 65 4d 6d 61 70 28      getPageMmap(
348e0 29 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 20  )           --  
348f0 55 73 65 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  Used if memory-m
34900 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61  apped I/O is ena
34910 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  bled.**.** If th
34920 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
34930 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
34940 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
34950 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
34960 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
34970 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
34980 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
34990 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
349a0 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
349b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
349c0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
349d0 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
349e0 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
349f0 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
34a00 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
34a10 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
34a20 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
34a30 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
34a40 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
34a50 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
34a60 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
34a70 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
34a80 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
34a90 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
34aa0 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
34ab0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
34ac0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
34ad0 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
34ae0 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
34af0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
34b00 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
34b10 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
34b20 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
34b30 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
34b40 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
34b50 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
34b60 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
34b70 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
34b80 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
34b90 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
34ba0 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 0a  ted page or if .
34bb0 2a 2a 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  ** the flags par
34bc0 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
34bd0 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
34be0 43 4f 4e 54 45 4e 54 20 62 69 74 20 61 6e 64 20  CONTENT bit and 
34bf0 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
34c00 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
34c10 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
34c20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
34c30 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
34c40 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
34c50 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34c60 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
34c70 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
34c80 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
34c90 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
34ca0 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e  * If PAGER_GET_N
34cb0 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65  OCONTENT is true
34cc0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
34cd0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
34ce0 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
34cf0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
34d00 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
34d10 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
34d20 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
34d30 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
34d40 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
34d50 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
34d60 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
34d70 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
34d80 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
34d90 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
34da0 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
34db0 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
34dc0 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
34dd0 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
34de0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
34df0 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
34e00 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
34e10 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47  **.** If PAGER_G
34e20 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20  ET_NOCONTENT is 
34e30 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
34e40 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
34e50 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a  zeroed instead.*
34e60 2a 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  * of being read 
34e70 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34e80 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
34e90 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
34ea0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
34eb0 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
34ec0 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
34ed0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
34ee0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
34ef0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
34f00 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
34f10 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
34f20 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
34f30 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
34f40 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
34f50 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
34f60 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
34f70 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
34f80 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
34f90 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
34fa0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
34fb0 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
34fc0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
34fd0 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
34fe0 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
34ff0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
35000 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
35010 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
35020 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
35030 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
35040 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
35050 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
35060 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
35070 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
35080 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
35090 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
350a0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
350b0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
350c0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
350d0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
350e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
350f0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
35100 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
35110 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
35120 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
35130 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
35140 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
35150 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
35160 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
35170 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
35180 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
35190 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
351a0 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
351b0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
351c0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
351d0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
351e0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
351f0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
35200 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
35210 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
35220 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
35230 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
35240 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  l files..*/.stat
35250 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f  ic int getPageNo
35260 72 6d 61 6c 28 0a 20 20 50 61 67 65 72 20 2a 70  rmal(.  Pager *p
35270 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
35280 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
35290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
352a0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
352b0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
352c0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
352d0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
352e0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
352f0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
35300 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
35310 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
35320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
35330 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
35340 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
35350 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
35360 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 75 38 20  gHdr *pPg;.  u8 
35370 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20  noContent;      
35380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35390 54 72 75 65 20 69 66 20 50 41 47 45 52 5f 47 45  True if PAGER_GE
353a0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73  T_NOCONTENT is s
353b0 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  et */.  sqlite3_
353c0 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61  pcache_page *pBa
353d0 73 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  se;..  assert( p
353e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
353f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
35400 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
35410 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
35420 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
35430 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
35440 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
35450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35460 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
35470 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ck==1 );..  if( 
35480 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
35490 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
354a0 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20 3d 20  BKPT;.  pBase = 
354b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
354c0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
354d0 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
354e0 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
354f0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
35500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
35510 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
35520 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35530 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
35540 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35550 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
35560 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35570 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
35580 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35590 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
355a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
355b0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
355c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20 3d     }.  }.  pPg =
355d0 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74   *ppPage = sqlit
355e0 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
355f0 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
35600 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65  che, pgno, pBase
35610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
35620 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20  ==(*ppPage) );. 
35630 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
35640 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
35650 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
35660 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67  r==pPager || pPg
35670 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
35680 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66    noContent = (f
35690 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
356a0 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a  _NOCONTENT)!=0;.
356b0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
356c0 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
356d0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
356e0 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
356f0 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
35700 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
35710 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
35720 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
35730 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
35740 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
35750 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
35760 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
35770 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
35780 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
35790 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
357a0 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b  PAGER_STAT_HIT]+
357b0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  +;.    return SQ
357c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
357d0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
357e0 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
357f0 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
35800 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
35810 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
35820 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 42  e initialized. B
35830 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65 72  ut first some er
35840 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20 20  ror checks:.    
35850 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54 68  **.    ** (1) Th
35860 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
35870 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a 20 20  umber is 2^31.  
35880 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72 20 74    ** (2) Never t
35890 72 79 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ry to fetch the 
358a0 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20 20 20  locking page.   
358b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
358c0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
358d0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
358e0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
358f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
35900 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35910 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
35920 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35930 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
35940 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
35950 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ..    assert( !i
35960 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
35970 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ) || !MEMDB );. 
35980 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
35990 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
359a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e  ager->dbSize<pgn
359b0 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29  o || noContent )
359c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
359d0 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
359e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
359f0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
35a00 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
35a10 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
35a20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
35a30 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
35a40 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
35a50 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
35a60 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
35a70 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
35a80 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
35a90 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
35aa0 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
35ab0 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
35ac0 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
35ad0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
35ae0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
35af0 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
35b00 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
35b10 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
35b20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
35b30 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
35b40 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
35b50 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
35b60 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
35b70 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
35b80 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
35b90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
35ba0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
35bb0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
35bc0 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
35bd0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
35be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
35bf0 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
35c00 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
35c10 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
35c20 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
35c30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
35c40 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
35c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35c60 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
35c70 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
35c80 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
35c90 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
35ca0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
35cb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
35cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
35cd0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
35ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35cf0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
35d00 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
35d10 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
35d20 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
35d30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
35d40 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
35d50 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46 72  e{.      u32 iFr
35d60 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
35d70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d           /* Fram
35d80 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57  e to read from W
35d90 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  AL file */.     
35da0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
35db0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35dc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35dd0 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
35de0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
35df0 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
35e00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35e10 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
35e20 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
35e40 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
35e50 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
35e60 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
35e70 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d  PAGER_STAT_MISS]
35e80 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
35e90 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69  eadDbPage(pPg, i
35ea0 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
35eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35ec0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
35ed0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35ee0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
35ef0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
35f00 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
35f10 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
35f20 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
35f30 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
35f40 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
35f50 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
35f60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
35f70 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
35f80 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
35f90 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
35fa0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
35fb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35fc0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
35fd0 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 54 68  MAP_SIZE>0./* Th
35fe0 65 20 70 61 67 65 20 67 65 74 74 65 72 20 66 6f  e page getter fo
35ff0 72 20 77 68 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61  r when memory-ma
36000 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62  pped I/O is enab
36010 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  led */.static in
36020 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 0a 20  t getPageMMap(. 
36030 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
36040 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
36050 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
36060 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
36070 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
36080 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
36090 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
360a0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
360b0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
360c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
360d0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
360e0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
360f0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
36100 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
36110 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36120 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
36130 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
36140 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
36150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
36160 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
36170 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  WAL file */..  /
36180 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61 62  * It is acceptab
36190 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61 64  le to use a read
361a0 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67  -only (mmap) pag
361b0 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65  e for any page e
361c0 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20  xcept.  ** page 
361d0 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  1 if there is no
361e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
361f0 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41  on open or the A
36200 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a  CQUIRE_READONLY.
36210 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70    ** flag was sp
36220 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 63  ecified by the c
36230 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f  aller. And so lo
36240 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73 20  ng as the db is 
36250 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70  not a .  ** temp
36260 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f  orary or in-memo
36270 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  ry database.  */
36280 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d  .  const int bMm
36290 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 0a 20  apOk = (pgno>1. 
362a0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
362b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
362c0 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50  ER || (flags & P
362d0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
362e0 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  Y)).  );..  asse
362f0 72 74 28 20 55 53 45 46 45 54 43 48 28 70 50 61  rt( USEFETCH(pPa
36300 67 65 72 29 20 29 3b 0a 23 69 66 64 65 66 20 53  ger) );.#ifdef S
36310 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
36320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36330 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 3b 0a 23  ->xCodec==0 );.#
36340 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 74 69  endif..  /* Opti
36350 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  mization note:  
36360 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f  Adding the "pgno
36370 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65  <=1" term before
36380 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a   "pgno==0" here.
36390 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20    ** allows the 
363a0 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
363b0 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  er to reuse the 
363c0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22  results of the "
363d0 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73  pgno>1".  ** tes
363e0 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
363f0 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  s statement, and
36400 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70   avoid testing p
36410 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20  gno==0 in the.  
36420 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  ** common case w
36430 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  here pgno is lar
36440 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ge. */.  if( pgn
36450 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20  o<=1 && pgno==0 
36460 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
36470 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36480 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
36490 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
364a0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
364b0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
364c0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
364d0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
364e0 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  t( pPager->hasHe
364f0 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20  ldSharedLock==1 
36500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36510 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
36520 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
36530 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
36540 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
36560 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
36570 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
36580 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
36590 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
365a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
365b0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
365c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
365d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 4d 6d 61  }.  }.  if( bMma
365e0 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30  pOk && iFrame==0
365f0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
36600 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ata = 0;.    rc 
36610 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68  = sqlite3OsFetch
36620 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20  (pPager->fd, .  
36630 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f        (i64)(pgno
36640 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
36650 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
36660 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61  pageSize, &pData
36670 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
36680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36690 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
366a0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
366b0 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20  te>PAGER_READER 
366c0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
366d0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
366e0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
366f0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
36700 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
36710 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
36720 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36730 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
36740 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
36750 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
36760 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36770 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
36780 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
36790 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70   (i64)(pgno-1)*p
367a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
367b0 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d   pData);.      }
367c0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29  .      if( pPg )
367d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
367e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
367f0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
36800 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ge = pPg;.      
36810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36820 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
36830 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
36840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36850 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
36860 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36870 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
36880 6e 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  n getPageNormal(
36890 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70  pPager, pgno, pp
368a0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Page, flags);.}.
368b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
368c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
368d0 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 70 61 67 65   */../* The page
368e0 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 66   getter method f
368f0 6f 72 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  or when the page
36900 72 20 69 73 20 61 6e 20 65 72 72 6f 72 20 73 74  r is an error st
36910 61 74 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate */.static in
36920 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 0a  t getPageError(.
36930 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
36940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
36950 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
36960 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
36970 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
36980 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36990 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
369a0 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
369b0 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
369c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
369d0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
369e0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
369f0 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
36a00 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
36a10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36a20 54 45 52 28 70 67 6e 6f 29 3b 0a 20 20 55 4e 55  TER(pgno);.  UNU
36a30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
36a40 61 67 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ags);.  assert( 
36a50 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
36a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
36a70 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
36a80 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
36a90 72 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69  rCode;.}.../* Di
36aa0 73 70 61 74 63 68 20 61 6c 6c 20 70 61 67 65 20  spatch all page 
36ab0 66 65 74 63 68 20 72 65 71 75 65 73 74 73 20 74  fetch requests t
36ac0 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
36ad0 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 2e  e getter method.
36ae0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
36af0 61 67 65 72 47 65 74 28 0a 20 20 50 61 67 65 72  agerGet(.  Pager
36b00 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
36b10 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
36b20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36b30 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
36b40 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
36b50 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
36b60 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
36b70 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
36b80 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
36b90 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
36ba0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
36bb0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
36bc0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
36bd0 61 67 73 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66  ags */.){.#ifdef
36be0 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45   SQLITE_SERVER_E
36bf0 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 70 61 67  DITION.  if( pag
36c00 65 72 49 73 53 65 72 76 65 72 28 70 50 61 67 65  erIsServer(pPage
36c10 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  r) ){.    int rc
36c20 20 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65 72   = sqlite3Server
36c30 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 70 53 65  Lock(pPager->pSe
36c40 72 76 65 72 2c 20 70 67 6e 6f 2c 20 30 2c 20 30  rver, pgno, 0, 0
36c50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36c60 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
36c70 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
36c80 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
36c90 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20 70  ->xGet(pPager, p
36ca0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61  gno, ppPage, fla
36cb0 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  gs);.}../*.** Ac
36cc0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
36cd0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
36ce0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
36cf0 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
36d00 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
36d10 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
36d20 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
36d30 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
36d40 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
36d50 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a  not in cache. .*
36d60 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
36d70 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
36d80 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
36d90 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
36da0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
36db0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
36dc0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
36dd0 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
36de0 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
36df0 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
36e00 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
36e10 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
36e20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
36e30 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
36e40 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
36e50 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
36e60 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
36e70 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
36e80 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
36e90 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
36ea0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
36eb0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
36ec0 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65    sqlite3_pcache
36ed0 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  _page *pPage;.  
36ee0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
36ef0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
36f00 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
36f10 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
36f20 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  che!=0 );.  pPag
36f30 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
36f40 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
36f50 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29  PCache, pgno, 0)
36f60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36f70 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
36f80 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
36f90 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  k );.  if( pPage
36fa0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
36fb0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
36fc0 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73  PcacheFetchFinis
36fd0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
36fe0 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b  e, pgno, pPage);
36ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
37000 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
37010 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
37020 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
37030 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
37040 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
37050 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
37060 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
37070 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
37080 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
37090 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
370a0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
370b0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
370c0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
370d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
370e0 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
370f0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
37100 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50  UnrefNotNull(DbP
37110 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
37120 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73  er *pPager;.  as
37130 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a  sert( pPg!=0 );.
37140 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
37150 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
37160 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
37170 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67  _MMAP ){.    pag
37180 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
37190 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (pPg);.  }else{.
371a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
371b0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
371c0 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
371d0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
371e0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
371f0 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
37200 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
37210 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  Pg ) sqlite3Page
37220 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
37230 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  g);.}../*.** Thi
37240 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
37250 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
37260 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
37270 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
37280 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
37290 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
372a0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
372b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
372c0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
372d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
372e0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
372f0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
37300 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
37310 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
37320 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
37330 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
37340 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
37350 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
37360 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
37370 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
37380 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
37390 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
373a0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
373b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
373c0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
373d0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
373e0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
373f0 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
37400 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
37410 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
37420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
37430 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
37440 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
37450 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
37460 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
37470 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
37480 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
37490 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
374a0 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
374b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
374c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
374d0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
374e0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
374f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
37500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
37510 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
37520 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
37530 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
37540 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
37550 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
37560 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
37570 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
37580 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
37590 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
375a0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
375b0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
375c0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
375d0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
375e0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
375f0 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
37600 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
37610 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
37620 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
37630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37640 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
37650 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
37660 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
37670 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
37680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37690 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
376a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
376b0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
376c0 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
376d0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
376e0 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
376f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37700 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37710 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
37720 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
37730 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37740 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
37750 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
37760 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
37770 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
37780 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
37790 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
377a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
377b0 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
377c0 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
377d0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
377e0 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
377f0 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
37800 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
37810 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
37820 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
37830 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
37840 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66  ->errCode;..  if
37850 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
37860 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
37870 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
37880 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37890 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67  _OFF ){.    pPag
378a0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
378b0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
378c0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
378d0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
378e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
378f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
37900 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
37910 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a  _BKPT;.    }.  .
37920 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
37930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
37940 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
37950 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69  y open. */.    i
37960 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
37970 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
37980 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
37990 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
379a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
379b0 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  RY ){.        sq
379c0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
379d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
379e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
379f0 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73         int flags
37a00 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
37a10 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
37a20 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
37a30 20 20 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b       int nSpill;
37a40 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
37a50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
37a60 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
37a70 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
37a80 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
37a90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
37aa0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
37ab0 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71       nSpill = sq
37ac0 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d  lite3Config.nStm
37ad0 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20  tSpill;.        
37ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
37af0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
37b00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
37b10 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53  AL;.          nS
37b20 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65  pill = jrnlBuffe
37b30 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
37b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37b50 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56     .        /* V
37b60 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
37b70 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61  atabase still ha
37b80 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
37b90 61 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20  as it did when. 
37ba0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73         ** it was
37bb0 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
37bc0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ed. */.        r
37bd0 63 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e  c = databaseIsUn
37be0 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20  moved(pPager);. 
37bf0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
37c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37c10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37c20 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a  e3JournalOpen (.
37c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
37c40 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
37c50 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
37c60 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c  d, flags, nSpill
37c70 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
37c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
37ca0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
37cb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
37cc0 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
37cd0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
37ce0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
37cf0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
37d00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
37d10 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
37d20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
37d30 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
37d40 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
37d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37d60 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
37d70 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
37d80 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
37d90 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
37da0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
37db0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
37dc0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
37dd0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
37de0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
37df0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37e00 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
37e10 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
37e20 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
37e30 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
37e40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37e50 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
37e60 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
37e70 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
37e80 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37e90 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
37ea0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
37eb0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37ec0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
37ed0 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
37ee0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
37ef0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
37f00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
37f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
37f20 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
37f30 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
37f40 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
37f50 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
37f60 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
37f70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
37f80 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
37f90 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
37fa0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
37fb0 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
37fc0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
37fd0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
37fe0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
37ff0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
38000 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
38010 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
38020 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
38030 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
38040 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
38050 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
38060 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
38070 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
38080 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
38090 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
380a0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
380b0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
380c0 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
380d0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
380e0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
380f0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
38100 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
38110 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
38120 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
38130 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
38140 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
38150 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
38160 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
38170 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
38180 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
38190 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
381a0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
381b0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
381c0 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
381d0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
381e0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
381f0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
38200 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
38210 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
38220 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
38230 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
38240 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
38250 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
38260 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
38270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
38280 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
38290 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
382a0 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
382b0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
382c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
382d0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
382e0 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
382f0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
38300 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
38310 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
38320 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
38330 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
38340 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
38350 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
38360 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
38370 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
38380 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
38390 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
383a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
383b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
383c0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
383d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
383e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
383f0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
38400 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
38410 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
38420 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
38430 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
38440 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
38450 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
38460 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
38470 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
38480 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
38490 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
384a0 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
384b0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
384c0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
384d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
384e0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
384f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
38500 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
38510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
38520 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
38530 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
38540 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73  .        (void)s
38550 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
38560 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
38570 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
38580 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
38590 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
385a0 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
385b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
385c0 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
385d0 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
385e0 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
385f0 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
38600 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
38610 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
38620 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
38630 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
38640 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
38650 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
38660 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
38670 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
38680 2