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

Artifact dff5eb9a3add702b28ef5efb54de761e1ba7aa44:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
4dc0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55   SQLITE_EXTRA_DU
4dd0: 52 41 42 4c 45 20 6f 70 74 69 6f 6e 20 69 73 20  RABLE option is 
4de0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
4df0: 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 53 51 4c  ime, then.** SQL
4e00: 69 74 65 20 77 69 6c 6c 20 64 6f 20 65 78 74 72  ite will do extr
4e10: 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61 74  a fsync() operat
4e20: 69 6f 6e 73 20 77 68 65 6e 20 73 79 6e 63 68 72  ions when synchr
4e30: 6f 6e 6f 75 73 3d 3d 46 55 4c 4c 20 74 6f 20 68  onous==FULL to h
4e40: 65 6c 70 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  elp.** ensure th
4e50: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  at transactions 
4e60: 61 72 65 20 64 75 72 61 62 6c 65 20 61 63 72 6f  are durable acro
4e70: 73 73 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ss a power failu
4e80: 72 65 2e 20 20 4d 6f 73 74 0a 2a 2a 20 61 70 70  re.  Most.** app
4e90: 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 20 68 61  lications are ha
4ea0: 70 70 79 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ppy as long as t
4eb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
4ec0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 63 72 6f 73  consistent acros
4ed0: 73 0a 2a 2a 20 61 20 70 6f 77 65 72 20 66 61 69  s.** a power fai
4ee0: 6c 75 72 65 2c 20 61 6e 64 20 61 72 65 20 70 65  lure, and are pe
4ef0: 72 66 65 63 74 6c 79 20 77 69 6c 6c 69 6e 67 20  rfectly willing 
4f00: 74 6f 20 6c 6f 73 65 20 74 68 65 20 6c 61 73 74  to lose the last
4f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4f20: 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
4f30: 74 68 65 20 65 78 74 72 61 20 70 65 72 66 6f 72  the extra perfor
4f40: 6d 61 6e 63 65 20 6f 66 20 61 76 6f 69 64 69 6e  mance of avoidin
4f50: 67 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  g directory sync
4f60: 73 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 74 68 65  s..** And so the
4f70: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
4f80: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 20 73 65  EXTRA_DURABLE se
4f90: 74 74 69 6e 67 20 69 73 20 6f 66 66 2e 0a 2a 2f  tting is off..*/
4fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fb0: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 23 20  EXTRA_DURABLE.# 
4fc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
4fd0: 54 52 41 5f 44 55 52 41 42 4c 45 20 30 0a 23 65  TRA_DURABLE 0.#e
4fe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
4ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5010: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
5020: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
5030: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
5040: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
5050: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
5060: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
5070: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
5080: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5090: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
50a0: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
50b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
50c0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
50d0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
50e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
50f0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
5100: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
5110: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
5120: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
5130: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
5140: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
5150: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5160: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
5170: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
5180: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
5190: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
51a0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
51b0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
51c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
51d0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
51e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
51f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
5200: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
5210: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
5220: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
5230: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
5240: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
5250: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
5260: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
5270: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
5280: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
5290: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
52a0: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
52b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
52c0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
52f0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
5300: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
5310: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5320: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
5330: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
5340: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
5350: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
5360: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
5370: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
5380: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
53a0: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
53b0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
53c0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53e0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
53f0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
5400: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
5410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5420: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
5430: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
5440: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
5450: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
5460: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
5470: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20 6f  };../*.** Bits o
5480: 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e 6f  f the Pager.doNo
5490: 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53 65  tSpill flag.  Se
54a0: 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72 69  e further descri
54b0: 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  ption below..*/.
54c0: 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41  #define SPILLFLA
54d0: 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30 78  G_OFF         0x
54e0: 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69 6c  01 /* Never spil
54f0: 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76 69  l cache.  Set vi
5500: 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65 66  a pragma */.#def
5510: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  ine SPILLFLAG_RO
5520: 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20 2f  LLBACK    0x02 /
5530: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5540: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5550: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5560: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5570: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f 2a  YNC      0x04 /*
5580: 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62 75   Spill is ok, bu
5590: 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a 2f  t do not sync */
55a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e 20  ../*.** An open 
55b0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
55c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
55d0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
55e0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
55f0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
5600: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
5610: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
5620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5630: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5640: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5650: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5660: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5670: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5680: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5690: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
56a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
56b0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
56c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
56d0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
56e0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
56f0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
5700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5710: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
5720: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5740: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5750: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5760: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5770: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5780: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5790: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
57a0: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
57b0: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
57c0: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
57d0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
57e0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
57f0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
5800: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
5810: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
5820: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5830: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5840: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5850: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5860: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5870: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5880: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5890: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
58a0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
58b0: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
58c0: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
58d0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
58e0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
58f0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
5900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
5910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
5920: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5930: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5940: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5950: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5960: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5970: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5990: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
59a0: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
59b0: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
59c0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
59d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59e0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
59f0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
5a00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
5a10: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
5a20: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5a30: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5a50: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5a60: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5a70: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5a80: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5a90: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5aa0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5ab0: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5ac0: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
5ad0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
5ae0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
5af0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
5b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5b10: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
5b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5b30: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5b40: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5b50: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5b60: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5b70: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5b80: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5b90: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5ba0: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
5bd0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
5be0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
5bf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
5c00: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
5c10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
5c20: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5c30: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5c40: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5c50: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5c60: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5c70: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5c80: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5c90: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5ca0: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5cb0: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5cc0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5cd0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ce0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5cf0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5d00: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5d10: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5d30: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5d40: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5d70: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5d90: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5da0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5db0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5dc0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5dd0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5de0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5df0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5e00: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5e10: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5e20: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5e30: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5e40: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5e50: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5e60: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5e70: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5e80: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5e90: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5ea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5eb0: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5ec0: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ed0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5ee0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5ef0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5f00: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5f10: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5f20: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5f30: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5f40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5f50: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5f60: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5f70: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5f80: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5f90: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5fa0: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5fb0: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5fc0: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5fd0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5fe0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5ff0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
6000: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
6010: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
6020: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
6030: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
6040: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
6050: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
6060: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
6070: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
6080: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
6090: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
60b0: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
60c0: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
60d0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
60e0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
60f0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
6100: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
6110: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
6120: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
6130: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
6140: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
6150: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
6160: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
6170: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
6180: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
6190: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
61a0: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
61b0: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
61c0: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
61d0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
61e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
61f0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
6200: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
6210: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
6220: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6230: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6240: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6250: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6260: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6270: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6280: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6290: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
62a0: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
62b0: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
62c0: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
62d0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
62e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
62f0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
6300: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6310: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6320: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6330: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6340: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6350: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6360: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6370: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6380: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6390: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
63a0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
63b0: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
63c0: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
63d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
63e0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
63f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6400: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
6410: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
6420: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6430: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6450: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6460: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6470: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6480: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6490: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
64a0: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
64b0: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
64c0: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a  e database from.
64d0: 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73 73  **   pagerStress
64e0: 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c  () is permitted,
64f0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
6500: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6510: 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20   not..**   This 
6520: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 73  flag is set by s
6530: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6540: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6550: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6560: 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72 67  ize.**   is larg
6570: 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
6580: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6590: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
65a0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
65b0: 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70 70  c.**   from happ
65c0: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
65d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
65e0: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
65f0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
6600: 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  . .**.** subjInM
6610: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
6620: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
6630: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
6640: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
6650: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
6660: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
6670: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
6680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6690: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
66a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
66b0: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
66c0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
66d0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
66e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  ..**.**   This v
66f0: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
6700: 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72 20  ed by the upper 
6710: 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65 20  layer each time 
6720: 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69 74  a new .**   writ
6730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6740: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 64   opened..**.** d
6750: 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a  bSize, dbOrigSiz
6760: 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  e, dbFileSize.**
6770: 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20 64  .**   Variable d
6780: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
67a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
67b0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
67c0: 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50 41  t is valid in PA
67d0: 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20 68  GER_READER and h
67e0: 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61 6c  igher states (al
67f0: 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74 20  l states except 
6800: 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61 6e  for.**   OPEN an
6810: 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a 2a  d ERROR). .**.**
6820: 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65 74     dbSize is set
6830: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
6840: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
6850: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
6860: 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72 67  ay be .**   larg
6870: 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
6880: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6890: 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72   (the value stor
68a0: 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ed at offset.** 
68b0: 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74 61    28 of the data
68c0: 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20 74  base header by t
68d0: 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74 68  he btree). If th
68e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
68f0: 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  le.**   is not a
6900: 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
6910: 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
6920: 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20 73  ize, the value s
6930: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64 62  tored in.**   db
6940: 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64 20  Size is rounded 
6950: 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b 42  down (i.e. a 5KB
6960: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6970: 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53 69  ge-size has dbSi
6980: 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78 63  ze==2)..**   Exc
6990: 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74 68  ept, any file th
69a0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
69b0: 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
69c0: 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
69d0: 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61 74  .**   to have at
69e0: 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
69f0: 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69 6c   (i.e. a 1KB fil
6a00: 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73  e with 2K page-s
6a10: 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20 74  ize leads.**   t
6a20: 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a 2a  o dbSize==1)..**
6a30: 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77  .**   During a w
6a40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a50: 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20  , if pages with 
6a60: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65  page-numbers gre
6a70: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 64  ater than.**   d
6a80: 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69  bSize are modifi
6a90: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
6aa0: 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74   dbSize is updat
6ab0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ed accordingly..
6ac0: 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c 20  **   Similarly, 
6ad0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6ae0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 69  is truncated usi
6af0: 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 65  ng PagerTruncate
6b00: 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20 64  Image(), .**   d
6b10: 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65 64  bSize is updated
6b20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  ..**.**   Variab
6b30: 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20 61  les dbOrigSize a
6b40: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61 72  nd dbFileSize ar
6b50: 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74 65  e valid in state
6b60: 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57 52  s .**   PAGER_WR
6b70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  ITER_LOCKED and 
6b80: 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53 69  higher. dbOrigSi
6b90: 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ze is a copy of 
6ba0: 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20 20  the dbSize.**   
6bb0: 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65 20  variable at the 
6bc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
6bd0: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
6be0: 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c 6c  used during roll
6bf0: 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20 74  back,.**   and t
6c00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
6c10: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65 73  her or not pages
6c20: 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
6c30: 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a 2a  nalled before.**
6c40: 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65     being modifie
6c50: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f 75  d..**.**   Throu
6c60: 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74 72  ghout a write-tr
6c70: 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69 6c  ansaction, dbFil
6c80: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
6c90: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20 20  he size of.**   
6ca0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69 73   in pages. It is
6cc0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6cd0: 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74 68  f dbSize when th
6ce0: 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61  e.**   write-tra
6cf0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
6d00: 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75 70  t opened, and up
6d10: 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20 63  dated when VFS c
6d20: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a  alls are made.**
6d30: 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20 74     to write or t
6d40: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
6d50: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
6d60: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  k. .**.**   The 
6d70: 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20  only reason the 
6d80: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
6d90: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
6da0: 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0a  is to suppress .
6db0: 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79  **   unnecessary
6dc0: 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63   calls to xTrunc
6dd0: 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d  ate() after comm
6de0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
6df0: 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20 20  tion. If, .**   
6e00: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
6e10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
6e20: 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20   the dbFileSize 
6e30: 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 74  variable indicat
6e40: 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74 68  es .**   that th
6e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6e60: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6e70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
6e80: 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65 29  e (Pager.dbSize)
6e90: 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  , .**   pager_tr
6ea0: 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c  uncate() is call
6eb0: 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74 72  ed. The pager_tr
6ec0: 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
6ed0: 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a 2a  es xFilesize().*
6ee0: 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20 74  *   to measure t
6ef0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f00: 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74 68   on disk, and th
6f10: 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74 20  en truncates it 
6f20: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  if required..** 
6f30: 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73 20    dbFileSize is 
6f40: 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72 6f  not used when ro
6f50: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
6f60: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
6f70: 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67 65  s case.**   page
6f80: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6f90: 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74 69  called unconditi
6fa0: 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d 65  onally (which me
6fb0: 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62 65  ans there may be
6fc0: 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f 20  .**   a call to 
6fd0: 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61 74  xFilesize() that
6fe0: 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79   is not strictly
6ff0: 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20 65   required). In e
7000: 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20 20  ither case,.**  
7010: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
7020: 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  ) may cause the 
7030: 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20 73  file to become s
7040: 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65 72  maller or larger
7050: 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53 69  ..**.** dbHintSi
7060: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ze.**.**   The d
7070: 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61 62  bHintSize variab
7080: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69  le is used to li
7090: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
70a0: 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f 0a  f calls made to.
70b0: 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46 69  **   the VFS xFi
70c0: 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f  leControl(FCNTL_
70d0: 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f  SIZE_HINT) metho
70e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48 69  d. .**.**   dbHi
70f0: 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  ntSize is set to
7100: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64   a copy of the d
7110: 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77  bSize variable w
7120: 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74 65  hen a.**   write
7130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
7140: 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73  opened (at the s
7150: 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69  ame time as dbFi
7160: 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20 20  leSize and.**   
7170: 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 20  dbOrigSize). If 
7180: 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
7190: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
71a0: 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  ) method is call
71b0: 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53  ed,.**   dbHintS
71c0: 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  ize is increased
71d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
71e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f 72  f pages that cor
71f0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a 2a  respond to the.*
7200: 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70 61  *   size-hint pa
7210: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74 68  ssed to the meth
7220: 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61 67  od call. See pag
7230: 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
7240: 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65  t() for .**   de
7250: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  tails..**.** err
7260: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  Code.**.**   The
7270: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
7280: 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20  ariable is only 
7290: 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47  ever used in PAG
72a0: 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
72b0: 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  It.**   is set t
72c0: 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74  o zero in all ot
72d0: 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50  her states. In P
72e0: 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
72f0: 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  , Pager.errCode 
7300: 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20  .**   is always 
7310: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
7320: 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
7330: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53   or one of the S
7340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
7350: 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e  .**   sub-codes.
7360: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
7370: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
7380: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
7390: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
73a0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
73b0: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
73c0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
73d0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
73e0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
73f0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
7400: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7420: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
7430: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
7440: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
7450: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
7460: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
7470: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7480: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
7490: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74b0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
74d0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
74e0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
74f0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
7500: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
7510: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
7520: 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72 61  ss */.  u8 extra
7530: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
7540: 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72 65      /* sync dire
7550: 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75 72  ctory after jour
7560: 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  nal delete */.  
7570: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7580: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7590: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
75a0: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
75b0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
75c0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
75d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
75e0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
75f0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
7600: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7610: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7620: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7630: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7640: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7650: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7670: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7680: 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61  porary or immuta
7690: 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ble file */.  u8
76a0: 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
76b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76c0: 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74  not lock (except
76d0: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f   in WAL mode) */
76e0: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
7710: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
7720: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
7750: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
7760: 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a   */..  /********
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
77c0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
77d0: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
77e0: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68   members that ch
77f0: 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a  ange during.  **
7800: 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69   routine operati
7810: 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65  on.  Class membe
7820: 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62  rs not in this b
7830: 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72 20  lock are either 
7840: 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20  fixed.  ** when 
7850: 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69 72  the pager is fir
7860: 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c  st created or el
7870: 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77  se only change w
7880: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20  hen there is a. 
7890: 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20   ** significant 
78a0: 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75 63  mode change (suc
78b0: 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68  h as changing th
78c0: 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63  e page_size, loc
78d0: 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20  king_mode,.  ** 
78e0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d  or the journal_m
78f0: 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74  ode).  From anot
7900: 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65 20  her view, these 
7910: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7920: 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20  scribe.  ** the 
7930: 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20 70  "state" of the p
7940: 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65  ager, while othe
7950: 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  r class members 
7960: 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a  describe the.  *
7970: 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  * "configuration
7980: 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  " of the pager..
7990: 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65    */.  u8 eState
79a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74     /* Pager stat
79c0: 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c  e (OPEN, READER,
79d0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e   WRITER_LOCKED..
79e0: 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  ) */.  u8 eLock;
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f     /* Current lo
7a10: 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62  ck held on datab
7a20: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
7a30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
7a40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
7a50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
7a60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
7a70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
7a80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
7a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7aa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
7ab0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
7ac0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
7ad0: 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20  oNotSpill;      
7ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7af0: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
7b00: 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  e when non-zero 
7b10: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
7b20: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
7b30: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7b40: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
7b50: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62  urnals */.  u8 b
7b60: 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20 20  UseFetch;       
7b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7b80: 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29 20  to use xFetch() 
7b90: 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53  */.  u8 hasHeldS
7ba0: 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20  haredLock;      
7bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73 68   /* True if a sh
7bc0: 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76  ared lock has ev
7bd0: 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a  er been held */.
7be0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c00: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7c10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7c20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7c30: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7c40: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7c50: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7c60: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7c70: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7c90: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7ca0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7cb0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7cc0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7cd0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7ce0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7cf0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7d00: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7d30: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7d40: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7d70: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7d80: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7d90: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7da0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7db0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7dc0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7dd0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7de0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7e10: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7e20: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7e30: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7e40: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7e50: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7e60: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7e70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
7e80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7e90: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20  IT_CONCURRENT.  
7ea0: 42 69 74 76 65 63 20 2a 70 41 6c 6c 52 65 61 64  Bitvec *pAllRead
7eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
7ec0: 61 67 65 73 20 72 65 61 64 20 77 69 74 68 69 6e  ages read within
7ed0: 20 63 75 72 72 65 6e 74 20 43 4f 4e 43 55 52 52   current CONCURR
7ee0: 45 4e 54 20 74 72 61 6e 73 2e 20 2a 2f 0a 23 65  ENT trans. */.#e
7ef0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
7f00: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
7f10: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7f20: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
7f30: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
7f40: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
7f50: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7f60: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
7f70: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
7f80: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
7f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7fa0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7fb0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7fc0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7fe0: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
7ff0: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
8000: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
8010: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
8020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
8030: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
8040: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
8050: 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  der */.  sqlite3
8060: 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
8070: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
8080: 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69  to list of ongoi
8090: 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ng backup proces
80a0: 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  ses */.  PagerSa
80b0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
80c0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
80d0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
80e0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
80f0: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
8100: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8110: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
8120: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 75  vepoint[] */.  u
8130: 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  32 iDataVersion;
8140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
8150: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
8160: 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20  atabase content 
8170: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68 61  changes */.  cha
8180: 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d  r dbFileVers[16]
8190: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ;        /* Chan
81a0: 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74  ges whenever dat
81b0: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
81c0: 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d 6d  es */..  int nMm
81d0: 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  apOut;          
81e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
81f0: 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75 72  f mmap pages cur
8200: 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69  rently outstandi
8210: 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ng */.  sqlite3_
8220: 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20 20  int64 szMmap;   
8230: 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20 6d      /* Desired m
8240: 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65  aximum mmap size
8250: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d 6d   */.  PgHdr *pMm
8260: 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20 20  apFreelist;     
8270: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
8280: 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61 64  e mmap page head
8290: 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f 0a  ers (pDirty) */.
82a0: 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66    /*.  ** End of
82b0: 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63   the routinely-c
82c0: 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d 65  hanging class me
82d0: 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a  mbers.  ********
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8320: 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74  ***/..  u16 nExt
8330: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
8340: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
8350: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
8360: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
8370: 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65  e */.  i16 nRese
8380: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
8390: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
83a0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74 20  unused bytes at 
83b0: 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  end of each page
83c0: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
83d0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
83e0: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
83f0: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
8400: 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63 74  () */.  u32 sect
8410: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8420: 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73      /* Assumed s
8430: 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e  ector size durin
8440: 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  g rollback */.  
8450: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20  int pageSize;   
8460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8470: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
8480: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  n a page */.  Pg
8490: 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20  no mxPgno;      
84a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
84b0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a  imum allowed siz
84c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
84d0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
84e0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
84f0: 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74     /* Size limit
8500: 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
8510: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
8520: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
8530: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
8540: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
8550: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
8560: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8580: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
8590: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
85a0: 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
85b0: 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e  )(void*); /* Fun
85c0: 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68  ction to call wh
85d0: 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69  en busy */.  voi
85e0: 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
85f0: 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  rg;      /* Cont
8600: 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72  ext argument for
8610: 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
8620: 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d 3b  .  int aStat[3];
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8640: 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68 69  * Total cache hi
8650: 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20 77  ts, misses and w
8660: 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  rites */.#ifdef 
8670: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
8680: 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  t nRead;        
8690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
86a0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
86b0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69   */.#endif.  voi
86c0: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
86d0: 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c  bPage*); /* Call
86e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
86f0: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
8700: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
8710: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8720: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8730: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8740: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8750: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8760: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8770: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
8780: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
8790: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87a0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87b0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87c0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
87e0: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
87f0: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8800: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8820: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8830: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8840: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8850: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8870: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
8880: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
8890: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88a0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88c0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88d0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
88e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
88f0: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8920: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8930: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8940: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8970: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
8980: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
8990: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89a0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89b0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89c0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89d0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
89e0: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
89f0: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a00: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a10: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a20: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a30: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a40: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a50: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a60: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a70: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8a80: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8a90: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8aa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8ab0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
8ac0: 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e  iables hold coun
8ad0: 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  ters used for.**
8ae0: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
8af0: 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76  s only.  These v
8b00: 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  ariables do not 
8b10: 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f  exist in.** a no
8b20: 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e  n-testing build.
8b30: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
8b40: 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  s are not thread
8b50: 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  -safe..*/.#ifdef
8b60: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
8b70: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
8b80: 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  eaddb_count = 0;
8b90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8ba0: 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64   full pages read
8bb0: 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20   from DB */.int 
8bc0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8bd0: 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  itedb_count = 0;
8be0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8bf0: 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74  full pages writt
8c00: 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20  en to DB */.int 
8c10: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8c20: 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  itej_count = 0; 
8c30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8c40: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c50: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65   journal */.# de
8c60: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
8c70: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
8c80: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8c90: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
8ca0: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
8cb0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
8cc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
8cd0: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
8ce0: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
8cf0: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
8d00: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
8d10: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
8d20: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
8d30: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
8d40: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
8d50: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
8d60: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
8d70: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
8d80: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
8d90: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
8da0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
8db0: 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72  l is being.** wr
8dc0: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
8dd0: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
8de0: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
8df0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
8e00: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
8e10: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
8e20: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
8e30: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
8e40: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
8e50: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
8e60: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
8e70: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
8e80: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
8e90: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
8ea0: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
8eb0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
8ec0: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
8ed0: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
8ee0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
8ef0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8f00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
8f10: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
8f20: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
8f30: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
8f40: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
8f50: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
8f60: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
8f70: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
8f80: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
8f90: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
8fa0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
8fb0: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
8fc0: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
8fd0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
8fe0: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
8ff0: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
9000: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
9010: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
9020: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
9030: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
9040: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
9050: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
9060: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
9070: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
9080: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
9090: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
90a0: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
90b0: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
90c0: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
90d0: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
90e0: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
90f0: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
9100: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
9110: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
9120: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
9130: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
9140: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
9150: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
9160: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
9170: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
9180: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
9190: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
91a0: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
91b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
91c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
91d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
91e0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
91f0: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
9200: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
9210: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
9220: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
9230: 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f  f each page reco
9240: 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  rd in the journa
9250: 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  l is given by.**
9260: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
9270: 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  acro..*/.#define
9280: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
9290: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
92a0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
92b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
92c0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
92d0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
92e0: 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
92f0: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a  the same .** siz
9300: 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69  e as a single di
9310: 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61  sk sector. See a
9320: 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a  lso setSectorSiz
9330: 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e()..*/.#define 
9340: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9350: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
9360: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
9370: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
9380: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
9390: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
93a0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
93b0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
93c0: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
93d0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
93e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
93f0: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
9400: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
9410: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
9420: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
9430: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
9440: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
9450: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
9460: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
9470: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
9480: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9490: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
94a0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
94b0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
94c0: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
94d0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53 45  ** The macro USE
94e0: 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69 66  FETCH is true if
94f0: 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20   we are allowed 
9500: 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74 63  to use the xFetc
9510: 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a  h and xUnfetch.*
9520: 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f 20  * interfaces to 
9530: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
9540: 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79  ase using memory
9550: 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a  -mapped I/O..*/.
9560: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
9570: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66  MAP_SIZE>0.# def
9580: 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29 20  ine USEFETCH(x) 
9590: 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68 29  ((x)->bUseFetch)
95a0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
95b0: 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23 65  USEFETCH(x) 0.#e
95c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
95d0: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
95e0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
95f0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
9600: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
9610: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
9620: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
9630: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
9640: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
9650: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
9660: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
9670: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
9680: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
9690: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
96a0: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
96b0: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
96c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
96d0: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
96e0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
96f0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
9700: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
9710: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
9720: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
9730: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
9740: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
9750: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
9760: 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a 2f  >pMethods!=0)../
9770: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
9780: 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75   if this pager u
9790: 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61  ses a write-ahea
97a0: 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66  d log instead of
97b0: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f   the usual.** ro
97c0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
97d0: 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  Otherwise false.
97e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
97f0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74  TE_OMIT_WAL.stat
9800: 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57  ic int pagerUseW
9810: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
9820: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  ){.  return (pPa
9830: 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d  ger->pWal!=0);.}
9840: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
9850: 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30  pagerUseWal(x) 0
9860: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52  .# define pagerR
9870: 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a  ollbackWal(x) 0.
9880: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61  # define pagerWa
9890: 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29  lFrames(v,w,x,y)
98a0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
98b0: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
98c0: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
98d0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
98e0: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
98f0: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
9900: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
9910: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
9920: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9930: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
9940: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
9950: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
9960: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
9970: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
9980: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
9990: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
99a0: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
99b0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
99c0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
99d0: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
99e0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
99f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9a00: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
9a10: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
9a20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9a30: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
9a40: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
9a50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
9a60: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
9a70: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9a80: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
9a90: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9aa0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9ab0: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
9ac0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9ad0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9ae0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9af0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9b00: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
9b10: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9b20: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9b30: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
9b40: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
9b50: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
9b60: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
9b70: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
9b80: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
9b90: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
9ba0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9bb0: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
9bc0: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
9bd0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
9be0: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
9bf0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9c00: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
9c10: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
9c20: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9c30: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
9c40: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
9c50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
9c60: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
9c70: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
9c80: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
9c90: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
9ca0: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
9cb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9cc0: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
9cd0: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
9ce0: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
9cf0: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
9d00: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
9d10: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
9d20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9d30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9d40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9d50: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
9d60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9d70: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
9d80: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9d90: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
9da0: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
9db0: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
9dc0: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
9dd0: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
9de0: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
9df0: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
9e00: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
9e10: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
9e20: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9e30: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
9e40: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
9e50: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
9e60: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
9e70: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
9e80: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
9e90: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
9ea0: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
9eb0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9ec0: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
9ed0: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
9ee0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9ef0: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
9f00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9f10: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
9f20: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9f30: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
9f40: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
9f50: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
9f60: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
9f70: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
9f80: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
9f90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9fa0: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9fb0: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9fc0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9fd0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
9fe0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9ff0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a000: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
a010: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
a020: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
a030: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
a040: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
a050: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
a060: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
a070: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
a080: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
a090: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
a0a0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
a0b0: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
a0c0: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
a0d0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
a0e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
a0f0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
a100: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
a110: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a120: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
a130: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
a140: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
a150: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
a160: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
a170: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
a180: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
a190: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a1a0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a1b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a1c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a1d0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a1e0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
a1f0: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
a200: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
a210: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a220: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
a230: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a240: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a250: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a260: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a270: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a280: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a290: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
a2a0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65  OCK );.      bre
a2b0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a2c0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
a2d0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a2e0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a2f0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a300: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a310: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a320: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a330: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a340: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a350: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a360: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
a370: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   );.      }.#ifn
a380: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a390: 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 20 20 20  CONCURRENT.     
a3a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a3b0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a3c0: 3e 64 62 4f 72 69 67 53 69 7a 65 20 7c 7c 20 70  >dbOrigSize || p
a3d0: 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20  Pager->pAllRead 
a3e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
a3f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a400: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a410: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
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 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a440: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a450: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a460: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a470: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a490: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a4a0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4c0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a4d0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a4e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a4f0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a500: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a510: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a520: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a530: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a540: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a550: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a560: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a570: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a580: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a590: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a5a0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a5b0: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a5c0: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a5d0: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a5e0: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a5f0: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a600: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a610: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a620: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a630: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a640: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a660: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a680: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a690: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a6a0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a6b0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a6c0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a6d0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a6e0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a6f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a700: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a710: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a720: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a730: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a740: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a750: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a770: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a780: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a790: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a7a0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a7b0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a7c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a7d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a7e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a7f0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a800: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a810: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a820: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a840: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a850: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a860: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a870: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a880: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a890: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a8a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a8b0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a8c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a8d0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a8e0: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a8f0: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a900: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a910: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a920: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a930: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a940: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a950: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a960: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a980: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a990: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a9a0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a9b0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a9c0: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a9d0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a9e0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a9f0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
aa00: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
aa10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa20: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
aa30: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
aa40: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
aa50: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
aa60: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
aa70: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
aa80: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
aa90: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
aaa0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
aab0: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
aac0: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
aad0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
aae0: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
aaf0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
ab00: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
ab10: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ab20: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
ab30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
ab40: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
ab50: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
ab60: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
ab70: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
ab80: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
ab90: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
aba0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
abb0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
abc0: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
abd0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
abe0: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
abf0: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
ac00: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
ac10: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ac20: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
ac30: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
ac40: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
ac50: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
ac60: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
ac70: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
ac80: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
ac90: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
aca0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
acb0: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
acc0: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
acd0: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
ace0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
acf0: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
ad00: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
ad10: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
ad20: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
ad30: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
ad40: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
ad50: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
ad60: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
ad70: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
ad80: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
ad90: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
ada0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
adb0: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
adc0: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
add0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
ade0: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
adf0: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
ae00: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ae10: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
ae20: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
ae30: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
ae40: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
ae50: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
ae60: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
ae70: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
ae80: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
ae90: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
aea0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
aeb0: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
aec0: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
aed0: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
aee0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
aef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
af00: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
af10: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
af20: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
af30: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
af40: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
af50: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
af60: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
af70: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
af80: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
af90: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
afa0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
afb0: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
afc0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
afd0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
afe0: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
aff0: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
b000: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
b010: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
b020: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
b030: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
b040: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
b050: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
b060: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
b070: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
b080: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
b090: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
b0a0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
b0b0: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
b0c0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
b0d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
b0e0: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
b0f0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
b100: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
b110: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
b120: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b130: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
b140: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
b150: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b160: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
b170: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
b180: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b190: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
b1a0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
b1b0: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
b1c0: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
b1d0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b1e0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
b1f0: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
b200: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b210: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b220: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
b230: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
b240: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b250: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b260: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
b270: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
b280: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b290: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b2a0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
b2b0: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
b2c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b2d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b2e0: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
b2f0: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
b300: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b310: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b320: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
b330: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
b340: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b350: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
b360: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
b370: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
b380: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
b390: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
b3a0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
b3b0: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b3c0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b3d0: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b3e0: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b3f0: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b400: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b410: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b420: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b430: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b440: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b450: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b460: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b470: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b480: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b490: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b4a0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b4b0: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b4c0: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b4d0: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b4e0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b4f0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b500: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b510: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b520: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b530: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b540: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b550: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b560: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b570: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b580: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b590: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b5a0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b5b0: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b5c0: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b5d0: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b5e0: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b5f0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b600: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b610: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b620: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b630: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b640: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b650: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b660: 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53  tNotNull(p->pInS
b670: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
b680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b690: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
b6a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
b6b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b6c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b6d0: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b6e0: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
b6f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
b700: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b710: 49 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  InJournal(Pager 
b720: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
b730: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
b740: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
b750: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
b760: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
b770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b780: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
b790: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b7a0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b7b0: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b7c0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b7d0: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b7e0: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b7f0: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b800: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b810: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b820: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b830: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b840: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b850: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b860: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b870: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b880: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b890: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b8a0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b8b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b8c0: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b8d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b8e0: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b8f0: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b900: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b910: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b920: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b930: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b940: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b950: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b960: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b970: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b980: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b990: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b9a0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b9b0: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b9c0: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b9d0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b9e0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b9f0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
ba00: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
ba10: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
ba20: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
ba30: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
ba40: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
ba50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ba60: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
ba70: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
ba80: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
ba90: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
baa0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
bab0: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
bac0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
bad0: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
bae0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
baf0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
bb00: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
bb10: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
bb20: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
bb30: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
bb40: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
bb50: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
bb60: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
bb70: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
bb80: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
bb90: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
bba0: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
bbb0: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
bbc0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
bbd0: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
bbe0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
bbf0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
bc00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
bc10: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bc20: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
bc30: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
bc40: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
bc50: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
bc60: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
bc70: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
bc80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bc90: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
bca0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
bcb0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
bcc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
bcd0: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
bce0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
bcf0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bd00: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
bd10: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
bd20: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
bd30: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
bd40: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
bd50: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
bd60: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
bd70: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
bd80: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
bd90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bda0: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
bdb0: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
bdc0: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
bdd0: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
bde0: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
bdf0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
be00: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
be10: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
be20: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
be30: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
be40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  k;.    }.    IOT
be50: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
be60: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
be70: 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65  eLock)).  }.  re
be80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
be90: 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  * Lock the datab
bea0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
beb0: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
bec0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48  ust be either SH
bed0: 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45  ARED_LOCK,.** RE
bee0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
bef0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49  XCLUSIVE_LOCK. I
bf00: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
bf10: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
bf20: 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  the.** Pager.eLo
bf30: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
bf40: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
bf50: 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  tate. .**.** Exc
bf60: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
bf70: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
bf80: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
bf90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bfa0: 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20   .** called, do 
bfb0: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e  not modify it un
bfc0: 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63  less the new loc
bfd0: 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58  king state is EX
bfe0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a  CLUSIVE_LOCK. .*
bff0: 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  * See the commen
c000: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
c010: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
c020: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
c030: 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68  nation .** of th
c040: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
c050: 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61  t pagerLockDb(Pa
c060: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
c070: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
c080: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
c090: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
c0a0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c0b0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
c0c0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45  LOCK || eLock==E
c0d0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
c0e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
c0f0: 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50  Lock<eLock || pP
c100: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
c110: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c120: 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f   rc = pPager->no
c130: 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Lock ? SQLITE_OK
c140: 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   : sqlite3OsLock
c150: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c160: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
c170: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
c180: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
c190: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
c1a0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c1b0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
c1c0: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c1d0: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
c1e0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
c1f0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
c200: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
c210: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c220: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c230: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
c240: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c250: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
c260: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
c270: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
c280: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
c290: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c2a0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
c2b0: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
c2c0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c2d0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
c2e0: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
c2f0: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
c300: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
c310: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
c320: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
c330: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
c340: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
c350: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
c360: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
c370: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
c380: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
c390: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
c3a0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
c3b0: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
c3c0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
c3d0: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
c3e0: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
c3f0: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
c400: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
c410: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
c420: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
c430: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
c440: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
c450: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
c460: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
c470: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
c480: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c490: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c4a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c4b0: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
c4c0: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
c4d0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
c4e0: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
c4f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
c500: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
c510: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
c520: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
c530: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
c540: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
c550: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c560: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
c590: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
c5a0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
c5b0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5d0: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
c5e0: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
c610: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
c620: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c630: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
c640: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
c650: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
c660: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
c670: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
c680: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
c690: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
c6a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
c6b0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c6c0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
c6d0: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
c6e0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c6f0: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
c700: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
c710: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
c720: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c730: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
c740: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
c750: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c760: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
c770: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
c780: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
c790: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c7a0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
c7b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
c7c0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
c7d0: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
c7e0: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
c7f0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
c800: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
c810: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
c820: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
c830: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
c840: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c850: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c860: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
c870: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
c880: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
c890: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
c8a0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
c8b0: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
c8c0: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
c8d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c8e0: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c8f0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c900: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c910: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c920: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c930: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c940: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c950: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c960: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c970: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c980: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c990: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c9a0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c9b0: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c9c0: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c9d0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c9e0: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c9f0: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
ca00: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
ca10: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
ca20: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
ca30: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
ca40: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
ca50: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
ca60: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
ca70: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
ca80: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
ca90: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
caa0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
cab0: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
cac0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
cad0: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
cae0: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
caf0: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
cb00: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
cb10: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
cb20: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
cb30: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
cb40: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
cb50: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
cb60: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
cb70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
cb80: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
cb90: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
cba0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
cbb0: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
cbc0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
cbd0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
cbe0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
cbf0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
cc00: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
cc10: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
cc20: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
cc30: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
cc40: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
cc50: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
cc60: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
cc70: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
cc80: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
cc90: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
cca0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
ccb0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
ccc0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
ccd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
cce0: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
ccf0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cd00: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
cd10: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
cd20: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
cd30: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
cd40: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
cd50: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
cd60: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
cd70: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
cd80: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
cd90: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
cda0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
cdb0: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
cdc0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
cdd0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
cde0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
cdf0: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
ce00: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
ce10: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
ce20: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
ce30: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
ce40: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
ce50: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
ce60: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
ce70: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
ce80: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
ce90: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
cea0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ceb0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
cec0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ced0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
cee0: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
cef0: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
cf00: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
cf10: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
cf20: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
cf30: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
cf40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
cf50: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
cf60: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
cf70: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
cf80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cf90: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cfa0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
cfb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
cfc0: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
cfd0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
cfe0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
cff0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
d000: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
d010: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
d020: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
d030: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
d040: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
d050: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
d060: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
d070: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
d080: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d090: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
d0a0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
d0b0: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
d0c0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
d0d0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
d0e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d0f0: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
d100: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
d110: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
d120: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
d130: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d140: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
d150: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
d160: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
d170: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
d180: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
d190: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
d1a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d1b0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
d1c0: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
d1d0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
d1e0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
d1f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d200: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
d230: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
d240: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
d250: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d270: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
d280: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
d290: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
d2c0: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
d2d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d2e0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
d2f0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
d300: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
d310: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
d320: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
d330: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
d340: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d350: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
d360: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
d370: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d380: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d390: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
d3a0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
d3b0: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
d3c0: 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  | len==0 .   || 
d3d0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d3e0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d3f0: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
d400: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
d410: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d420: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d430: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
d440: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
d450: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
d460: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
d470: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d480: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d490: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
d4a0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
d4b0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
d4c0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
d4d0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
d4e0: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
d4f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d500: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
d510: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
d520: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
d530: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
d540: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
d550: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
d560: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
d570: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
d580: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
d590: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
d5a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
d5b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
d5c0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
d5d0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d5e0: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d5f0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d600: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d610: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d620: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d630: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d640: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d650: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d660: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d670: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d690: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d6a0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d6b0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d6c0: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d6d0: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d6e0: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d6f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d700: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d710: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d720: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d730: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d740: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d750: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d760: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d770: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d780: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7b0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d7e0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d7f0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d800: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d810: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d820: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d840: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d850: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d860: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d870: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d880: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d890: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d8a0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d8b0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d8c0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d8d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d8e0: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d8f0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d900: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d910: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d920: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d930: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d940: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d950: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d960: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d980: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d990: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d9a0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d9b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d9c0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d9d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d9e0: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d9f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
da00: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
da10: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
da20: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
da30: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
da40: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
da50: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
da60: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
da70: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
da80: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
da90: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
daa0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
dab0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
dac0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
dad0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
dae0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
daf0: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
db00: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
db10: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
db20: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
db30: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
db40: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
db50: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
db60: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
db70: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
db80: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
db90: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
dba0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
dbb0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
dbc0: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
dbd0: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
dbe0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
dbf0: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
dc00: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
dc10: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
dc20: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
dc30: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
dc40: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
dc50: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
dc60: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
dc70: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
dc80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
dc90: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
dca0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
dcb0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
dcc0: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
dcd0: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
dce0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dcf0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
dd00: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
dd10: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
dd20: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
dd30: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
dd40: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
dd50: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
dd60: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
dd70: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
dd80: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
dd90: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
dda0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
ddb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dde0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
ddf0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
de00: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
de10: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
de20: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
de30: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
de40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
de50: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
de60: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
de70: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
de80: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
de90: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
dea0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
deb0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
dec0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ded0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
dee0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
def0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df00: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
df10: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
df20: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
df30: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
df40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
df50: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
df60: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
df70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
df80: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
df90: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
dfa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dfb0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
dfc0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
dfd0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
dfe0: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
dff0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
e000: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
e010: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
e020: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
e030: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
e040: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
e050: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
e060: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
e070: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
e080: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
e090: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
e0a0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
e0b0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
e0c0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
e0d0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
e0e0: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
e0f0: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
e100: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
e110: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
e120: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
e130: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
e140: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
e150: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
e160: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
e170: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
e180: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
e190: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
e1a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
e1b0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
e1c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e1d0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
e1e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e1f0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e200: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
e210: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e220: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
e240: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e250: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e260: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e270: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e280: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e290: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e2a0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e2b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e2c0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e2d0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e2e0: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e2f0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e300: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e310: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e320: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e330: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e340: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e350: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e360: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e370: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e380: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e390: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e3a0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e3b0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e3c0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e3d0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e3e0: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e3f0: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e400: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e410: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e420: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e430: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e440: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e450: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e460: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e470: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e480: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e490: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e4a0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e4b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e4c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e4f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e500: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e510: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e520: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e530: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e540: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e550: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e560: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e570: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e580: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e590: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e5a0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e5c0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e5d0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e5e0: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e610: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e620: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e630: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e640: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e650: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e660: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e670: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e680: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e690: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e6a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e6b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e6c0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e6d0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e6e0: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e6f0: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e700: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e710: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e720: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e730: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e740: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e750: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e760: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e770: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e780: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e790: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e7a0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e7b0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e7c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e7d0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e7e0: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e7f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e800: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e810: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e820: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e830: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e840: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e850: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e860: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e870: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e880: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e890: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e8a0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e8b0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e8c0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e8d0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e8e0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e8f0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e900: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e910: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e920: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e930: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e940: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e950: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e960: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e970: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e980: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e990: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e9a0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e9b0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e9c0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e9d0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e9e0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e9f0: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
ea00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
ea10: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
ea20: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
ea30: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
ea40: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
ea50: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
ea60: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
ea70: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
ea80: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
ea90: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
eaa0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
eab0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
eac0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
ead0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
eae0: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
eaf0: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
eb00: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
eb10: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
eb20: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
eb30: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
eb40: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
eb50: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
eb60: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
eb70: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
eb80: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
eb90: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
eba0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
ebb0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
ebc0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
ebd0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
ebe0: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
ebf0: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
ec00: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
ec10: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
ec20: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
ec30: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
ec40: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
ec50: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
ec60: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
ec70: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ec80: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
ec90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
eca0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ecb0: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
ecc0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
ecd0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
ece0: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
ecf0: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
ed00: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
ed10: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
ed20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ed30: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ed40: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
ed50: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ed60: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ed70: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
ed80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
ed90: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
eda0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
edb0: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
edc0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
edd0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
ede0: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
edf0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
ee00: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ee10: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ee20: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ee30: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ee40: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ee50: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
ee60: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ee70: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
ee80: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ee90: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
eea0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
eeb0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
eec0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
eed0: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
eee0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
eef0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
ef00: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ef10: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ef20: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ef30: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ef40: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
ef50: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
ef60: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
ef70: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
ef80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ef90: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
efa0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
efb0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
efc0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
efd0: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
efe0: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
eff0: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
f000: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
f010: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
f020: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
f030: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
f040: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
f050: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
f060: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
f070: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
f080: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
f090: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
f0a0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
f0b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f0c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f0d0: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
f0e0: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
f0f0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
f100: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
f110: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
f120: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
f130: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
f140: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
f150: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
f160: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
f170: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
f180: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
f190: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
f1a0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
f1b0: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
f1c0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
f1d0: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
f1e0: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
f1f0: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
f200: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
f210: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
f220: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
f230: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
f240: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
f250: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f260: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f270: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f280: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f290: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f2a0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f2b0: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f2c0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f2d0: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f2e0: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f2f0: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f300: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f310: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f320: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f330: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f340: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f350: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f360: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f370: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f380: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f390: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f3a0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f3b0: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f3c0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f3d0: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f3e0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f3f0: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f400: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f410: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f420: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f430: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f440: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f450: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f460: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f470: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f480: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f490: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f4a0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f4b0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f4c0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f4d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f4e0: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f4f0: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f500: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f510: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f530: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f540: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f550: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f560: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f570: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f580: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f590: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f5a0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f5b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f5c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f5d0: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f5e0: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f5f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f600: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f610: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f620: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f630: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f640: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f650: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f660: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f670: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f680: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f690: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f6a0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f6b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f6c0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f6d0: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f6e0: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f6f0: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f700: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f710: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f720: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f730: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f740: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f750: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f760: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f770: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f780: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f790: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f7a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f7b0: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f7c0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f7d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f7e0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f7f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f800: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f810: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f820: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f830: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f840: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f850: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f860: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f870: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f880: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f890: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f8a0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f8b0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f8c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f8d0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f8e0: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f8f0: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f900: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f910: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f920: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f930: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f940: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f950: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f960: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f970: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f980: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f9a0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f9b0: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f9c0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f9e0: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f9f0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
fa00: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
fa10: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
fa20: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
fa30: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
fa40: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
fa50: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fa70: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
fa80: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
fa90: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
faa0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
fad0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
fae0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
faf0: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
fb00: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
fb10: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
fb20: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
fb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
fb40: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
fb50: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
fb60: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
fb70: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
fb80: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
fb90: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
fba0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
fbb0: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
fbc0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
fbd0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
fbe0: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
fbf0: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
fc00: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
fc10: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
fc20: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
fc30: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
fc40: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
fc50: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fc60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fc70: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fc80: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fc90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fca0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fcb0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fcc0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fcd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fce0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fcf0: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
fd00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fd10: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fd20: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fd30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fd40: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
fd50: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fd60: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fd70: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fd80: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fd90: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fda0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fdb0: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fdc0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fdd0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fde0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fdf0: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fe00: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fe10: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fe20: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fe30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fe40: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fe50: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fe60: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fe70: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fe80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fe90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fea0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
feb0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fec0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fed0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fee0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fef0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
ff00: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
ff10: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
ff20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
ff30: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
ff40: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
ff50: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
ff60: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
ff70: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
ff80: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
ff90: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ffa0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
ffb0: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
ffc0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
ffd0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
ffe0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fff0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10000 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
10010 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
10020 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10030 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10040 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
10050 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
10060 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
10070 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10080 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10090 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
100a0 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
100b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
100c0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
100d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
100e0 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
100f0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
10100 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
10110 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
10120 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
10130 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10150 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
10160 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
10170 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
10180 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
10190 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
101a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
101b0 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
101c0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
101d0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
101e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
101f0 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
10200 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
10210 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10220 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10230 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10240 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
10250 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
10260 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10270 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
10280 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
10290 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
102a0 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
102b0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
102c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
102d0 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
102e0 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
102f0 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
10300 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
10310 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
10320 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
10330 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
10340 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10350 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
10360 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
10370 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
10390 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
103a0 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
103b0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
103c0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
103d0 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
103e0 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
103f0 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
10400 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
10410 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
10420 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
10430 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
10440 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
10450 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
10460 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
10470 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
10480 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
10490 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
104a0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
104b0 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
104c0 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
104d0 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
104e0 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
104f0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10500 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
10510 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
10520 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
10530 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
10540 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
10550 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
10560 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
10570 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10580 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
10590 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
105a0 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
105b0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
105c0 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
105d0 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
105e0 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
105f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10600 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10610 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10620 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10630 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10640 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
10650 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10670 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
10680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10690 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
106a0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
106b0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
106c0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
106d0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
106e0 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
106f0 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10700 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10710 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10720 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10730 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10740 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
10750 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10760 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10770 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
10780 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10790 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
107a0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
107b0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
107c0 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
107d0 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
107e0 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
107f0 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10800 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10810 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10820 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10830 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10840 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10850 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10860 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10870 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
10880 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10890 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
108a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
108b0 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
108c0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
108d0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
108e0 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
108f0 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10900 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10910 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10920 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10930 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10940 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
10950 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10960 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10970 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
10980 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10990 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
109a0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
109b0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
109c0 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
109d0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
109e0 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
109f0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10a00 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10a10 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10a20 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10a30 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10a40 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
10a50 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10a60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10a70 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
10a80 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
10a90 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
10aa0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10ab0 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10ac0 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10ad0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10ae0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10af0 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10b00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10b10 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10b20 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10b30 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10b40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10b50 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10b60 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10b70 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10b80 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10b90 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10ba0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10bb0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10bc0 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10bd0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10be0 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10bf0 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10c00 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10c10 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10c20 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10c30 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10c40 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10c50 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10c60 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10c70 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10c80 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10c90 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10ca0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10cb0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10cd0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10ce0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10cf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10d00 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10d30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10d40 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d60 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10d70 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10d80 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10db0 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10dc0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10dd0 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10df0 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10e00 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10e10 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10e40 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10e50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10e60 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10e80 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10e90 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10ea0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10eb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10ec0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10ed0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10ee0 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10ef0 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10f10 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10f20 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10f30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10f40 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10f50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10f60 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10f70 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10f80 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10f90 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10fa0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10fb0 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10fc0 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10fd0 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10fe0 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10ff0 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
11000 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
11010 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
11020 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
11030 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
11040 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
11050 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11060 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
11070 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
11080 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
11090 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
110a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
110b0 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
110c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
110d0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
110e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
110f0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
11100 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
11110 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
11120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
11130 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
11140 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
11150 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
11160 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
11170 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
11180 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
11190 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
111a0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
111b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
111c0 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
111d0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
111e0 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
111f0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
11200 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11210 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
11220 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
11230 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
11240 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
11250 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11260 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11270 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11280 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
11290 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
112a0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
112b0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
112c0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
112d0 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
112e0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
112f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11300 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
11310 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
11320 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
11350 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
11360 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11370 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
11380 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
11390 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
113a0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
113b0 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
113c0 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
113d0 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
113e0 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
113f0 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
11400 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
11410 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11420 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
11430 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
11440 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
11450 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
11460 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
11470 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
11480 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
11490 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
114a0 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
114b0 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
114c0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
114d0 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
114e0 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
114f0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
11500 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
11510 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
11520 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
11530 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
11540 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
11550 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
11560 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
11570 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
11580 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11590 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
115a0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
115b0 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
115c0 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
115d0 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
115e0 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
115f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11600 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
11610 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11620 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
11630 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11640 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
11650 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11660 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11670 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11680 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11690 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
116a0 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
116b0 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
116c0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
116d0 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
116e0 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
116f0 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
11700 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
11710 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11720 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
11730 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
11740 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
11750 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
11760 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
11770 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11780 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
11790 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
117a0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
117b0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
117c0 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
117d0 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
117e0 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
117f0 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11800 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11810 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11820 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11830 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11840 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
11850 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11860 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11870 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
11880 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11890 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
118a0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
118b0 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
118c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
118d0 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
118e0 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
118f0 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11900 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11910 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11920 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11930 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11940 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
11950 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11960 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
11970 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
11980 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
11990 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
119a0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
119b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
119c0 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
119d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
119e0 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
119f0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11a00 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11a10 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11a20 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11a30 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11a40 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
11a50 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
11a60 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
11a70 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
11a80 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
11a90 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
11aa0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11ab0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11ac0 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11ad0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11ae0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11af0 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11b00 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11b10 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11b20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11b30 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11b40 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11b50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11b60 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11b70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11b80 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
11b90 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
11ba0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11bb0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11bc0 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11bd0 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11be0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11bf0 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11c00 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11c10 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11c20 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11c30 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11c40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11c50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11c60 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
11c70 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
11c80 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
11c90 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
11ca0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11cb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11cc0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
11cd0 54 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20  T./*.** If they 
11ce0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 2c  are not already,
11cf0 20 62 65 67 69 6e 20 72 65 63 6f 72 64 69 6e 67   begin recording
11d00 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20   all pages read 
11d10 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
11d20 61 79 65 72 0a 2a 2a 20 62 79 20 74 68 65 20 62  ayer.** by the b
11d30 2d 74 72 65 65 20 6c 61 79 65 72 20 54 68 69 73  -tree layer This
11d40 20 69 73 20 75 73 65 64 20 62 79 20 63 6f 6e 63   is used by conc
11d50 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
11d60 6f 6e 73 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53  ons. Return.** S
11d70 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11d80 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
11d90 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
11da0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69  (SQLITE_NOMEM) i
11db0 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
11dc0 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
11dd0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f  ite3PagerBeginCo
11de0 6e 63 75 72 72 65 6e 74 28 50 61 67 65 72 20 2a  ncurrent(Pager *
11df0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
11e00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
11e20 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lRead==0 ){.    
11e30 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
11e40 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
11e50 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
11e60 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
11e70 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
11e80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
11e90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11ea0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11eb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  rn rc;.}../* !de
11ec0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11ed0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
11ee0 0a 2a 2a 20 53 74 6f 70 20 72 65 63 6f 72 64 69  .** Stop recordi
11ef0 6e 67 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  ng all pages rea
11f00 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
11f10 20 6c 61 79 65 72 20 62 79 20 74 68 65 20 62 2d   layer by the b-
11f20 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61 6e  tree layer.** an
11f30 64 20 64 69 73 63 61 72 64 20 61 6e 79 20 63 75  d discard any cu
11f40 72 72 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a 2a  rrent records..*
11f50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
11f60 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74  gerEndConcurrent
11f70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11f80 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
11f90 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11fa0 70 41 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50 61  pAllRead);.  pPa
11fb0 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20  ger->pAllRead = 
11fc0 30 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65  0;.}../* !define
11fd0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
11fe0 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20  NCURRENT).**.** 
11ff0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
12000 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
12010 6e 20 77 61 6c 20 6d 6f 64 65 2e 20 46 61 6c 73  n wal mode. Fals
12020 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
12030 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12040 49 73 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  IsWal(Pager *pPa
12050 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
12060 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 3b 0a  Pager->pWal!=0;.
12070 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12080 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
12090 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  NT */../*.** Fre
120a0 65 20 74 68 65 20 50 61 67 65 72 2e 70 49 6e 4a  e the Pager.pInJ
120b0 6f 75 72 6e 61 6c 20 61 6e 64 20 50 61 67 65 72  ournal and Pager
120c0 2e 70 41 6c 6c 52 65 61 64 20 62 69 74 76 65 63  .pAllRead bitvec
120d0 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
120e0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
120f0 65 65 42 69 74 76 65 63 73 28 50 61 67 65 72 20  eeBitvecs(Pager 
12100 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
12110 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
12120 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
12130 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
12140 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
12150 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e    sqlite3PagerEn
12160 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 50 61 67  dConcurrent(pPag
12170 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  er);.}../*.** Th
12180 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
12190 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
121a0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
121b0 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
121c0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
121d0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
121e0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
121f0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
12200 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
12210 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
12220 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
12230 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
12240 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
12250 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
12260 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
12270 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
12280 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
12290 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
122a0 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
122b0 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
122c0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
122d0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
122e0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
122f0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
12300 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
12310 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
12320 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
12330 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12340 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
12350 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12360 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
12370 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
12380 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
12390 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
123a0 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
123b0 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
123c0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
123d0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
123e0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
123f0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
12400 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
12410 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
12420 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
12430 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
12440 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
12450 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
12460 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
12470 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
12480 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
12490 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
124a0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
124b0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
124c0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
124d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
124e0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
124f0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
12500 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
12510 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
12520 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12530 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
12540 20 20 70 61 67 65 72 46 72 65 65 42 69 74 76 65    pagerFreeBitve
12550 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  cs(pPager);.  re
12560 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
12570 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
12580 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
12590 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
125a0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
125b0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
125c0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
125d0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
125e0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
125f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12600 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12610 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
12620 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
12630 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12650 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
12660 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
12670 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
12680 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
12690 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
126a0 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
126b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
126c0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
126d0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
126e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
126f0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
12700 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
12710 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
12720 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
12730 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
12740 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12750 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
12760 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
12770 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
12780 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
12790 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
127a0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
127b0 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
127c0 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
127d0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
127e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
127f0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
12800 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12810 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
12820 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
12830 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12840 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12850 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
12860 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12870 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12880 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
12890 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
128a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
128b0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
128c0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
128d0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
128e0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
128f0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
12900 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
12910 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
12920 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12930 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
12940 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12950 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
12960 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12970 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
12980 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12990 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
129a0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
129b0 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
129c0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
129d0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
129e0 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
129f0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
12a00 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
12a10 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
12a20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
12a30 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
12a40 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
12a50 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
12a60 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
12a70 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
12a80 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
12a90 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
12aa0 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
12ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12ac0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
12ad0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
12ae0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
12af0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
12b00 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
12b10 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
12b20 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
12b30 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
12b40 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
12b50 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
12b60 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
12b70 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
12b80 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
12b90 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
12ba0 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
12bb0 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
12bc0 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
12bd0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
12be0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
12bf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12c00 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12c10 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12c20 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12c30 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12c40 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12c50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12c60 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12c70 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12c80 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12c90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12ca0 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
12cb0 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
12cc0 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
12cd0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
12ce0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
12cf0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
12d00 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12d10 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12d20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
12d30 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
12d40 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12d50 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12d60 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12d70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12d80 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12d90 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12da0 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
12db0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12dc0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12dd0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
12de0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
12df0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12e00 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
12e10 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12e30 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
12e40 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
12e50 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
12e60 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ->fd, 0, 0);.  }
12e70 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12e80 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
12e90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12ea0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12eb0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
12ec0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12ed0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
12ee0 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
12ef0 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
12f00 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
12f10 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
12f20 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
12f30 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
12f40 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
12f50 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12f60 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12f70 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12f80 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
12f90 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
12fa0 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
12fb0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12fc0 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
12fd0 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
12fe0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
12ff0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
13000 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
13010 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
13020 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
13030 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
13040 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
13050 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
13060 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
13070 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
13080 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
13090 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
130a0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
130b0 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
130c0 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
130d0 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
130e0 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
130f0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
13100 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
13110 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
13120 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
13130 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
13140 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
13150 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
13160 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
13170 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13180 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
13190 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
131a0 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
131b0 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
131c0 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
131d0 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
131e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
131f0 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
13200 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
13210 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
13220 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
13230 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
13240 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
13250 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
13260 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
13270 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
13280 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
13290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
132a0 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
132b0 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
132c0 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
132d0 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
132e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
132f0 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
13300 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
13310 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
13320 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
13330 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
13340 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
13350 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
13360 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
13370 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
13380 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
13390 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
133a0 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
133b0 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
133c0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
133d0 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
133e0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
133f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
13400 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
13410 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
13420 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
13430 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
13440 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
13450 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
13460 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a  r, Pgno nPage);.
13470 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13480 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
13490 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61  action. A transa
134a0 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79  ction is usually
134b0 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69   ended by .** ei
134c0 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72  ther a COMMIT or
134d0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72   a ROLLBACK oper
134e0 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74  ation. This rout
134f0 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ine may be calle
13500 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c  d .** after roll
13510 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  back of a hot-jo
13520 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20  urnal, or if an 
13530 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
13540 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68  le opening.** th
13550 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
13560 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65  r writing the ve
13570 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  ry first journal
13580 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20  -header of a.** 
13590 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
135a0 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tion..** .** Thi
135b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
135c0 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47  er called in PAG
135d0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
135e0 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a  If it is called.
135f0 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45  ** in PAGER_NONE
13600 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44   or PAGER_SHARED
13610 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c   state and the l
13620 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73  ock held is less
13630 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68  .** exclusive th
13640 61 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  an a RESERVED lo
13650 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ck, it is a no-o
13660 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  p..**.** Otherwi
13670 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
13680 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
13690 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
136a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
136b0 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
136c0 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
136d0 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
136e0 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
136f0 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
13700 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
13710 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
13720 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
13730 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
13740 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
13750 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
13760 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
13770 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
13780 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13790 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
137a0 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
137b0 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
137c0 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
137d0 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
137e0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
137f0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
13800 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
13810 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
13820 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
13830 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
13840 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
13850 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
13860 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13870 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
13880 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
13890 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
138a0 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
138b0 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
138c0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
138d0 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
138e0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
138f0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
13900 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
13910 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
13920 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
13930 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
13940 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
13950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
13960 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
13970 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
13980 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
13990 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
139a0 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
139b0 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
139c0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
139d0 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
139e0 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
139f0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13a00 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13a10 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
13a20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
13a30 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
13a40 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
13a50 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
13a60 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
13a70 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
13a80 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
13a90 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
13aa0 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
13ab0 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
13ac0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
13ad0 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
13ae0 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
13af0 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
13b00 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
13b10 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
13b20 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
13b30 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
13b40 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
13b50 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
13b60 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
13b70 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
13b80 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
13b90 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67  nalized, the pag
13ba0 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45  er moves to PAGE
13bb0 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a  R_READER state..
13bc0 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  ** If running in
13bd0 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72   non-exclusive r
13be0 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68  ollback mode, th
13bf0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  e lock on the fi
13c00 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72  le is .** downgr
13c10 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44  aded to a SHARED
13c20 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
13c30 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
13c40 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
13c50 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
13c60 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
13c70 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49  .** any of the I
13c80 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  O operations to 
13c90 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
13ca0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c  rnal file or unl
13cb0 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ock the.** datab
13cc0 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ase then the IO 
13cd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
13ce0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
13cf0 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f  er. If the .** o
13d00 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61  peration to fina
13d10 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
13d20 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65   file fails, the
13d30 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c  n the code still
13d40 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c  .** tries to unl
13d50 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
13d60 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20   file if not in 
13d70 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20  exclusive mode. 
13d80 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b  If the.** unlock
13d90 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73   operation fails
13da0 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74   as well, then t
13db0 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63  he first error c
13dc0 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74  ode related.** t
13dd0 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  o the first erro
13de0 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74  r encountered (t
13df0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  he journal final
13e00 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a  ization one) is.
13e10 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
13e20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13e30 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
13e40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13e50 69 6e 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69  int hasMaster, i
13e60 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69  nt bCommit){.  i
13e70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13e80 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  K;      /* Error
13e90 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e   code from journ
13ea0 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13eb0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
13ec0 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
13ed0 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  OK;     /* Error
13ee0 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69   code from db fi
13ef0 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  le unlock operat
13f00 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20  ion */..  /* Do 
13f10 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70  nothing if the p
13f20 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
13f30 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
13f40 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
13f50 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20  * or at least a 
13f60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54  RESERVED lock. T
13f70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
13f80 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
13f90 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
13fa0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13fb0 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20  on active but a 
13fc0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
13fd0 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a  ter lock is.  **
13fe0 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20   held under two 
13ff0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20  circumstances:. 
14000 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66   **.  **   1. Af
14010 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c  ter a successful
14020 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
14030 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c  lback, it is cal
14040 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20  led with.  **   
14050 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52     eState==PAGER
14060 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d  _NONE and eLock=
14070 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e  =EXCLUSIVE_LOCK.
14080 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
14090 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  If a connection 
140a0 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  with locking_mod
140b0 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64  e=exclusive hold
140c0 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
140d0 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b   .  **      lock
140e0 20 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74   switches back t
140f0 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e  o locking_mode=n
14100 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65  ormal and then e
14110 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20  xecutes a.  **  
14120 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63      read-transac
14130 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74  tion, this funct
14140 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ion is called wi
14150 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52  th eState==PAGER
14160 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20  _READER .  **   
14170 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58     and eLock==EX
14180 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65  CLUSIVE_LOCK whe
14190 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  n the read-trans
141a0 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  action is closed
141b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
141c0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
141d0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
141e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
141f0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
14200 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50  RROR );.  if( pP
14210 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
14220 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
14230 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
14240 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  k<RESERVED_LOCK 
14250 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14260 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
14270 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
14280 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ints(pPager);.  
14290 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
142a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
142b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
142c0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
142d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
142e0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
142f0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
14300 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
14310 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
14320 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
14330 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
14340 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
14350 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
14360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14370 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14380 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14390 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20  MEMORY );.      
143a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
143b0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
143c0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
143d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
143e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
143f0 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  E_TRUNCATE ){.  
14400 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14410 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
14420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14430 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
14440 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
14450 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
14460 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
14470 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
14480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14490 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  && pPager->fullS
144a0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
144b0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
144c0 65 20 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20  e new file size 
144d0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
144e0 74 68 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20  the inode right 
144f0 61 77 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20  away..          
14500 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  ** Otherwise the
14510 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72   journal might r
14520 65 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69  esurrect followi
14530 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  ng a power loss 
14540 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
14550 20 63 61 75 73 65 20 74 68 65 20 6c 61 73 74 20   cause the last 
14560 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72  transaction to r
14570 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20  oll back.  See. 
14580 20 20 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70           ** http
14590 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a  s://bugzilla.moz
145a0 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75  illa.org/show_bu
145b0 67 2e 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33  g.cgi?id=1072773
145c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
145d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
145e0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
145f0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
14600 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
14610 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14620 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
14630 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
14640 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
14650 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14660 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14670 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c  _PERSIST.      |
14680 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
14690 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
146a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
146b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
146c0 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20  DE_WAL).    ){. 
146d0 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
146e0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
146f0 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
14700 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
14710 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
14720 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
14730 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62  his branch may b
14740 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20  e executed with 
14750 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
14760 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20  e==MEMORY if.   
14770 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72     ** a hot-jour
14780 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c  nal was just rol
14790 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69  led back. In thi
147a0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
147b0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  al.      ** file
147c0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
147d0 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49  d and deleted. I
147e0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
147f0 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20  n writes to.    
14800 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
14810 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20  e file, it will 
14820 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69  do so using an i
14830 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
14840 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
14850 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20    int bDelete = 
14860 28 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  (!pPager->tempFi
14870 6c 65 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75  le && sqlite3Jou
14880 72 6e 61 6c 45 78 69 73 74 73 28 70 50 61 67 65  rnalExists(pPage
14890 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20  r->jfd));.      
148a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
148b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
148c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
148d0 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20  ELETE .         
148e0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
148f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14900 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
14910 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  RY .           |
14920 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
14930 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14940 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
14950 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
14960 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
14970 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
14980 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20  if( bDelete ){. 
14990 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
149a0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
149b0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
149c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
149d0 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a  er->extraSync);.
149e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
149f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
14a00 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73  _CHECK_PAGES.  s
14a10 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
14a20 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
14a30 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
14a40 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20  set_pagehash);. 
14a50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
14a60 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ize==0 && sqlite
14a70 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
14a80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
14a90 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
14aa0 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  *p = sqlite3Page
14ab0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
14ac0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  1);.    if( p ){
14ad0 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61  .      p->pageHa
14ae0 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  sh = 0;.      sq
14af0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
14b00 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d  otNull(p);.    }
14b10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
14b20 61 67 65 72 46 72 65 65 42 69 74 76 65 63 73 28  agerFreeBitvecs(
14b30 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
14b40 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
14b50 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
14b60 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
14b70 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
14b80 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
14b90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14ba0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
14bb0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
14bc0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
14bd0 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
14be0 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
14bf0 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
14c00 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
14c10 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
14c20 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
14c30 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
14c40 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
14c50 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
14c60 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
14c70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14c80 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14c90 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
14ca0 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
14cb0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
14cc0 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
14cd0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
14ce0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
14cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14d00 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65  bCommit && pPage
14d10 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50  r->dbFileSize>pP
14d20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
14d30 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
14d40 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
14d50 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
14d60 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c  ansaction in rol
14d70 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20  lback-journal.  
14d80 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65    ** mode if the
14d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
14da0 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72  n disk is larger
14db0 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
14dc0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
14dd0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
14de0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
14df0 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
14e00 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
14e10 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73  n .    ** succes
14e20 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64  sfully committed
14e30 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53  , but the EXCLUS
14e40 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c  IVE lock is stil
14e50 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  l held on the.  
14e60 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74    ** file. So it
14e70 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e   is safe to trun
14e80 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
14e90 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69  e file to its mi
14ea0 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71  nimum.    ** req
14eb0 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a  uired size.  */.
14ec0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14ed0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
14ee0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
14ef0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
14f00 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
14f10 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
14f20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
14f30 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69  ITE_OK && bCommi
14f40 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  t && isOpen(pPag
14f50 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  er->fd) ){.    r
14f60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
14f70 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
14f80 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
14f90 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57  L_COMMIT_PHASETW
14fa0 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  O, 0);.    if( r
14fb0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
14fc0 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
14fd0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
14fe0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
14ff0 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21  veMode .   && (!
15000 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15010 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61  er) || sqlite3Wa
15020 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
15030 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29  Pager->pWal, 0))
15040 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  .  ){.    rc2 = 
15050 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
15060 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
15070 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
15080 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
15090 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
150a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
150b0 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67  R_READER;.  pPag
150c0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
150d0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0;..  return (rc
150e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
150f0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  rc);.}../*.** Ex
15100 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
15110 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
15120 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
15130 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
15140 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
15150 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15160 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
15170 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
15180 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74  state, do not at
15190 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f  tempt .** the ro
151a0 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74  llback at this t
151b0 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61  ime. Instead, pa
151c0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
151d0 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63  called. The.** c
151e0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
151f0 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61  ock() will disca
15200 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
15210 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a   pages, unlock.*
15220 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
15230 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ile and move the
15240 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f   pager back to O
15250 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68  PEN state. If th
15260 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  is .** means tha
15270 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  t there is a hot
15280 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e  -journal left in
15290 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
152a0 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63  , the next .** c
152b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74  onnection to obt
152c0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
152d0 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28  k on the pager (
152e0 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69  which may be thi
152f0 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20  s one) .** will 
15300 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
15310 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
15320 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
15330 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
15340 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  OR state, but an
15350 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
15360 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
15370 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
15380 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
15390 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
153a0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
153b0 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74  ter the ERROR st
153c0 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
153d0 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
153e0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
153f0 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
15400 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
15410 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15420 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
15430 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
15440 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
15450 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
15460 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67  ER_ERROR && pPag
15470 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
15480 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73  R_OPEN ){.    as
15490 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
154a0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
154b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
154c0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
154d0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
154e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
154f0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
15500 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
15510 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
15520 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
15530 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
15540 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
15550 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
15560 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
15570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15580 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
15590 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
155a0 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74       pager_end_t
155b0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
155c0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
155d0 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
155e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
155f0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
15600 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
15610 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
15620 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15630 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
15640 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
15650 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
15660 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
15670 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
15680 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
15690 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
156a0 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
156b0 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
156c0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
156d0 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
156e0 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
156f0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
15700 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
15710 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
15720 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
15730 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
15740 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
15750 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
15760 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
15770 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
15780 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
15790 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
157a0 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
157b0 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
157c0 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
157d0 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
157e0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
157f0 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
15800 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
15810 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
15820 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
15830 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
15840 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
15850 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
15860 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
15870 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
15880 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
15890 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
158a0 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
158b0 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
158c0 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
158d0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
158e0 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
158f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
15900 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
15910 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
15920 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
15930 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
15940 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
15950 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
15960 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
15970 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
15980 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
15990 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
159a0 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
159b0 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
159c0 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
159d0 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
159e0 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
159f0 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
15a00 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
15a10 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
15a20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
15a30 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
15a40 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15a50 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
15a60 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
15a70 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
15a80 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
15a90 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
15aa0 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
15ab0 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
15ac0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
15ad0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15ae0 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
15af0 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
15b00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
15b10 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
15b20 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
15b30 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15b40 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15b50 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
15b60 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
15b70 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
15b80 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
15b90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bb0 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
15bc0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15bd0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
15be0 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
15bf0 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
15c00 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
15c10 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
15c20 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
15c30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
15c40 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61  S_CODEC./*.** Ma
15c50 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62  ke sure the numb
15c60 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
15c70 69 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20  its is the same 
15c80 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
15c90 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69  on.** pager as i
15ca0 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72  t is in the sour
15cb0 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20  ce.  This comes 
15cc0 75 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d  up when a VACUUM
15cd0 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20   changes the.** 
15ce0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
15cf0 65 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22  ed bits to the "
15d00 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e  optimal" amount.
15d10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15d20 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76  PagerAlignReserv
15d30 65 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20  e(Pager *pDest, 
15d40 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20  Pager *pSrc){.  
15d50 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65  if( pDest->nRese
15d60 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65  rve!=pSrc->nRese
15d70 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74  rve ){.    pDest
15d80 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72  ->nReserve = pSr
15d90 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  c->nReserve;.   
15da0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15db0 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  (pDest);.  }.}.#
15dc0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
15dd0 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
15de0 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
15df0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
15e00 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
15e10 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
15e20 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
15e30 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
15e40 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
15e50 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
15e60 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
15e70 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
15e80 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
15e90 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
15ea0 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
15eb0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
15ec0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
15ed0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
15ee0 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
15ef0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
15f00 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
15f10 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
15f20 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
15f30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
15f40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
15f50 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
15f60 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15f70 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
15f80 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15f90 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15fa0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
15fb0 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
15fc0 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
15fd0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
15fe0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
15ff0 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
16000 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
16010 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
16020 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
16030 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
16040 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
16050 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
16060 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
16070 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
16080 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
16090 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
160a0 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
160b0 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
160c0 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
160d0 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
160e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
160f0 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
16100 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
16110 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
16120 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16130 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
16140 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
16150 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
16160 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
16170 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
16180 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
16190 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
161a0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
161b0 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
161c0 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
161d0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
161e0 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
161f0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
16200 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16210 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
16220 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
16230 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
16240 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
16250 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
16260 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
16270 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
16280 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
16290 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
162a0 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
162b0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
162c0 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
162d0 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
162e0 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
162f0 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
16300 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
16310 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
16320 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
16330 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
16340 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
16350 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
16360 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
16370 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
16380 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
16390 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
163a0 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
163b0 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
163c0 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
163d0 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
163e0 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
163f0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
16400 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
16410 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
16420 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
16430 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
16440 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
16450 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
16460 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
16470 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
16480 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
16490 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
164a0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
164b0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
164c0 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
164d0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
164e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16500 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
16510 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
16520 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16540 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
16550 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
16560 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
16570 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16580 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
16590 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
165a0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
165b0 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
165c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
165d0 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
165e0 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
165f0 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
16600 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
16610 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
16620 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
16630 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
16640 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
16650 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
16660 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
16670 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
16680 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
16690 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
166a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
166b0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
166c0 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
166d0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
166e0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
166f0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
16700 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
16710 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
16720 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16740 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
16750 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
16760 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
16770 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
16780 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
16790 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
167a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
167b0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
167c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
167d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
167e0 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
167f0 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
16800 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
16810 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
16820 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
16830 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16840 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
16850 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
16860 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
16870 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
16880 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
16890 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
168a0 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
168b0 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
168c0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
168d0 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
168e0 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
168f0 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
16900 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
16910 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
16920 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
16930 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
16940 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
16950 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
16960 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
16970 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
16980 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
16990 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
169a0 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
169b0 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
169c0 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
169d0 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
169e0 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
169f0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
16a00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
16a10 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
16a20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
16a30 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
16a40 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
16a50 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
16a60 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16a70 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
16a80 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16a90 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
16aa0 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
16ab0 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
16ac0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16ad0 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
16ae0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
16af0 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
16b00 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
16b10 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
16b20 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
16b30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16b40 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
16b50 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
16b60 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
16b70 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
16b80 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
16b90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
16ba0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
16bb0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16bc0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
16bd0 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
16be0 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
16bf0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16c00 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
16c10 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
16c20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
16c30 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
16c40 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
16c50 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
16c60 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
16c70 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
16c80 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
16c90 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
16ca0 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
16cb0 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
16cc0 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
16cd0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16ce0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16cf0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
16d00 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
16d10 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
16d20 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
16d30 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
16d40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
16d60 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
16d70 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
16d80 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
16d90 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
16da0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
16db0 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
16dc0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
16dd0 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
16de0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
16df0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
16e00 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
16e10 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
16e20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
16e30 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
16e40 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
16e50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16e60 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
16e70 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
16e80 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
16e90 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
16ea0 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
16eb0 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
16ec0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
16ed0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
16ee0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
16ef0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
16f00 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
16f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16f20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
16f30 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
16f40 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
16f50 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
16f60 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
16f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16f80 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
16f90 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
16fa0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16fb0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
16fc0 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
16fd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16fe0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
16ff0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
17000 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
17010 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
17020 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17030 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
17040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17050 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
17060 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
17070 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69  back before duri
17080 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
17090 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
170a0 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
170b0 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
170c0 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
170d0 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
170e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
170f0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
17100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
17120 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
17130 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
17140 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
17150 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
17160 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
17170 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
17180 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
17190 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
171a0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
171b0 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
171c0 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
171d0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
171e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
171f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
17200 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
17210 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
17220 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
17230 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
17240 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
17250 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
17260 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
17270 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
17280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17290 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
172a0 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
172b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
172c0 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
172d0 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
172e0 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
172f0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
17300 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
17310 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
17320 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
17330 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
17340 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
17350 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
17360 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17370 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
17380 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
17390 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
173a0 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
173b0 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
173c0 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
173d0 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
173e0 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
173f0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
17400 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
17410 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
17420 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
17430 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
17440 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
17450 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
17460 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
17470 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
17480 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
17490 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
174a0 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
174b0 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
174c0 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
174d0 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
174e0 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
174f0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
17500 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
17510 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
17520 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
17530 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
17540 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17550 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
17560 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
17570 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17580 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
17590 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
175a0 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
175b0 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
175c0 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
175d0 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
175e0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
175f0 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
17600 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
17610 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
17620 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
17630 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
17640 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
17650 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
17660 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
17670 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
17680 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
17690 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
176a0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
176b0 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
176c0 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
176d0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
176e0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
176f0 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
17700 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
17710 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
17720 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17730 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17740 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17750 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
17760 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
17770 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
17780 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
17790 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
177a0 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
177b0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
177c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
177d0 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
177e0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
177f0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
17800 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
17810 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
17820 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
17830 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17850 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
17860 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
17870 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
17880 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
17890 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
178a0 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
178b0 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
178c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
178d0 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
178e0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
178f0 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
17900 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
17910 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
17920 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
17930 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
17940 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
17950 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
17960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
17970 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
17980 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
17990 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
179a0 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
179b0 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
179c0 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
179d0 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
179e0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
179f0 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
17a00 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
17a10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17a20 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
17a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17a40 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
17a50 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
17a60 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
17a70 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
17a80 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
17a90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
17aa0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
17ab0 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
17ac0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
17ad0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
17ae0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
17af0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
17b00 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
17b10 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
17b20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
17b30 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
17b40 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
17b50 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
17b60 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
17b70 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
17b80 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
17b90 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
17ba0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
17bb0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
17bc0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
17bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
17be0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
17bf0 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
17c00 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
17c10 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
17c20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
17c30 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
17c40 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17c50 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
17c60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
17c70 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
17c80 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
17c90 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
17ca0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
17cb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
17cc0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
17cd0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
17ce0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
17cf0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
17d00 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
17d10 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
17d20 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
17d30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
17d40 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
17d50 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
17d60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
17d70 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
17d80 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
17d90 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
17da0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
17db0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
17dc0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17dd0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
17de0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
17df0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
17e00 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
17e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
17e20 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
17e30 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
17e40 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
17e50 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
17e60 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17e70 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
17e80 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
17e90 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17ea0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
17eb0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
17ec0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
17ed0 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
17ee0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
17ef0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
17f00 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
17f10 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
17f20 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
17f30 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
17f40 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
17f50 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
17f60 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
17f70 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
17f80 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
17f90 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
17fa0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
17fb0 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
17fc0 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
17fd0 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
17fe0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
17ff0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
18000 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
18010 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
18020 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
18030 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
18040 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
18050 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
18060 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
18070 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
18080 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
18090 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
180a0 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
180b0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
180c0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
180d0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
180e0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
180f0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
18100 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
18110 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
18120 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
18130 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
18140 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
18150 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
18160 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
18170 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
18180 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
18190 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
181a0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
181b0 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
181c0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
181d0 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
181e0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
181f0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
18200 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
18210 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
18220 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
18230 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
18240 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
18250 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
18260 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
18270 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)==0 );.    pPa
18280 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18290 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  |= SPILLFLAG_ROL
182a0 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  LBACK;.    rc = 
182b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
182c0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
182d0 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
182e0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
182f0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
18300 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30  LAG_ROLLBACK)!=0
18310 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
18320 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
18330 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
18340 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  K;.    if( rc!=S
18350 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
18360 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66  n rc;.    pPg->f
18370 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
18380 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
18390 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
183a0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
183b0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
183c0 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
183d0 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
183e0 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
183f0 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
18400 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
18410 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
18420 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
18430 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
18440 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
18450 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
18460 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
18470 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
18480 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
18490 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
184a0 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
184b0 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
184c0 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
184d0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
184e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
184f0 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
18500 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
18510 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
18520 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
18530 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
18540 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
18550 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
18560 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
18570 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d  Pg);.    if( isM
18580 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53  ainJrnl && (!isS
18590 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73  avepnt || *pOffs
185a0 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  et<=pPager->jour
185b0 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20  nalHdr) ){.     
185c0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
185d0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
185e0 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f   were just resto
185f0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  red from the mai
18600 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  n .      ** jour
18610 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
18620 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ts content must 
18630 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20  be as they were 
18640 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  when the .      
18650 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
18660 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
18670 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
18680 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61   can mark the pa
18690 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63  ge.      ** as c
186a0 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72  lean, since ther
186b0 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65  e will be no nee
186c0 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75  d to write it ou
186d0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
186e0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
186f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
18700 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
18710 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
18720 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
18730 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
18740 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
18750 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
18760 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
18770 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
18780 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
18790 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
187a0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
187b0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
187c0 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
187d0 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
187e0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
187f0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
18800 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
18810 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
18820 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
18830 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
18840 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
18850 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
18860 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
18870 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18880 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
18890 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
188a0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
188b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
188c0 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
188d0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
188e0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
188f0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
18900 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
18910 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
18920 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
18930 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
18940 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18950 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
18960 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
18970 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
18980 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
18990 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
189a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
189b0 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
189c0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
189d0 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
189e0 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
189f0 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
18a00 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
18a10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
18a20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
18a30 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
18a40 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
18a50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
18a60 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
18a70 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
18a80 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
18a90 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
18aa0 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
18ab0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
18ac0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
18ad0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
18ae0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
18af0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
18b00 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
18b10 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
18b20 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
18b30 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
18b40 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
18b50 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
18b60 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
18b70 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
18b80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
18b90 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
18ba0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
18bb0 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
18bc0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
18bd0 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
18be0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
18bf0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
18c00 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
18c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18c20 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
18c30 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
18c40 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
18c50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
18c60 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
18c70 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
18c80 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
18c90 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18ca0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
18cb0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
18cc0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
18cd0 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
18ce0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
18cf0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18d00 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
18d10 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
18d20 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
18d30 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
18d40 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
18d50 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
18d60 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
18d70 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
18d80 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
18d90 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
18da0 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
18db0 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
18dc0 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
18dd0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
18de0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
18df0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
18e00 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
18e10 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
18e20 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
18e30 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
18e40 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
18e50 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
18e60 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
18e70 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
18e80 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
18e90 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
18ea0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
18eb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
18ec0 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
18ed0 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
18ee0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
18ef0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
18f00 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
18f10 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
18f20 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
18f30 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
18f40 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
18f50 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
18f60 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
18f70 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
18f80 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
18f90 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
18fa0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
18fb0 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
18fc0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18fd0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
18fe0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
18ff0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
19000 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
19010 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
19020 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
19030 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
19040 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
19050 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
19060 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19070 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
19080 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
19090 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
190a0 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
190b0 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
190c0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
190d0 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
190e0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
190f0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
19100 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
19110 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
19120 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
19130 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
19140 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
19150 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
19160 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
19170 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
19180 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
19190 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
191a0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
191b0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
191c0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
191d0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
191e0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
191f0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
19200 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
19210 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
19220 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
19230 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
19240 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
19250 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
19260 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
19270 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
19280 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
19290 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
192a0 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
192b0 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
192c0 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
192d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
192e0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
192f0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
19300 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
19310 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
19320 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
19330 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
19340 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19350 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
19360 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
19370 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
19380 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
19390 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
193a0 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
193b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
193c0 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
193d0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
193e0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
193f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
19400 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
19410 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19430 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
19440 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
19450 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
19460 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
19470 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
19480 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
19490 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
194a0 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
194b0 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
194c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
194d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
194e0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
194f0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
19500 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19510 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
19520 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
19530 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
19540 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19550 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
19560 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
19570 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
19580 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
19590 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
195a0 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
195b0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
195c0 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
195d0 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
195e0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
195f0 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
19600 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
19610 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
19620 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
19630 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
19640 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
19650 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
19660 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
19670 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
19680 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
19690 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
196a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
196b0 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
196c0 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
196d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
196e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
196f0 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
19700 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
19710 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
19720 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
19730 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
19740 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
19750 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
19760 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
19770 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
19780 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
19790 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
197a0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
197b0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
197c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
197d0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
197e0 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
197f0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
19800 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19810 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19820 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
19830 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
19840 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19850 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
19860 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
19870 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
19880 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
19890 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
198a0 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
198b0 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
198c0 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
198d0 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
198e0 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
198f0 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
19900 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
19910 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
19920 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
19930 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
19940 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19950 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
19960 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19980 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
19990 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
199a0 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
199b0 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
199c0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
199d0 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
199e0 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
199f0 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
19a00 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
19a10 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
19a20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
19a30 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19a40 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ut;.  }.  zMaste
19a50 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
19a60 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
19a70 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d  urnal+1];.  rc =
19a80 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
19a90 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
19aa0 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
19ab0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
19ac0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19ad0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19ae0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61  aster_out;.  zMa
19af0 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
19b00 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b  terJournal] = 0;
19b10 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a  ..  zJournal = z
19b20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
19b30 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
19b40 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
19b50 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
19b60 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73   ){.    int exis
19b70 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ts;.    rc = sql
19b80 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
19b90 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
19ba0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
19bb0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
19bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
19be0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19bf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
19c00 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
19c10 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
19c20 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
19c30 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
19c40 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
19c50 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
19c60 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
19c70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
19c80 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
19c90 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
19ca0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
19cb0 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
19cc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
19cd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
19ce0 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   c;.      int fl
19cf0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
19d00 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
19d10 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
19d20 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
19d30 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19d40 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
19d50 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
19d60 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
19d70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19d80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19d90 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19da0 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
19db0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
19dc0 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
19dd0 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
19de0 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
19df0 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
19e00 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
19e10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19e20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19e30 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19e40 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
19e50 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
19e60 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
19e70 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
19e80 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
19e90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
19ea0 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
19eb0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
19ec0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19ed0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
19ee0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19ef0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
19f00 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
19f10 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
19f20 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
19f30 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
19f40 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19f50 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19f60 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
19f70 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
19f80 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
19f90 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
19fa0 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19fb0 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
19fc0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19fd0 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
19fe0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
19ff0 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
1a000 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
1a010 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
1a020 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1a030 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1a040 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
1a050 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
1a060 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a070 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
1a080 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
1a090 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
1a0a0 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
1a0b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
1a0c0 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
1a0d0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
1a0e0 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
1a0f0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
1a100 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
1a110 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1a120 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
1a130 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
1a140 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
1a150 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
1a160 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
1a170 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1a180 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
1a190 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
1a1a0 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
1a1b0 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
1a1c0 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
1a1d0 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
1a1e0 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
1a1f0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
1a200 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
1a210 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
1a220 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
1a230 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
1a240 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
1a250 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
1a260 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
1a270 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
1a280 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
1a290 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
1a2a0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
1a2b0 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
1a2c0 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
1a2d0 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
1a2e0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
1a2f0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
1a300 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
1a310 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
1a320 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
1a330 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
1a340 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
1a350 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
1a360 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
1a370 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
1a380 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
1a390 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
1a3a0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
1a3b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
1a3c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1a3d0 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
1a3e0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
1a3f0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
1a400 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
1a410 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
1a420 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a430 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
1a440 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
1a450 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
1a460 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1a470 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1a480 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
1a490 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
1a4a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
1a4b0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
1a4c0 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28    .  if( isOpen(
1a4d0 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
1a4e0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1a4f0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1a500 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1a510 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1a520 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20  OPEN) .  ){.    
1a530 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
1a540 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e   newSize;.    in
1a550 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65  t szPage = pPage
1a560 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1a570 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a580 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
1a590 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a  E_LOCK );.    /*
1a5a0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
1a5b0 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
1a5c0 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
1a5d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1a5e0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1a5f0 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
1a600 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
1a610 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69  Size = szPage*(i
1a620 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
1a630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a640 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d  && currentSize!=
1a650 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1a660 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65   if( currentSize
1a670 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  >newSize ){.    
1a680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a690 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
1a6a0 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b  r->fd, newSize);
1a6b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a6c0 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a   (currentSize+sz
1a6d0 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29  Page)<=newSize )
1a6e0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1a6f0 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70  pTmp = pPager->p
1a700 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
1a710 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30    memset(pTmp, 0
1a720 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  , szPage);.     
1a730 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1a740 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d  wSize-szPage) ==
1a750 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1a760 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1a770 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
1a780 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a  e) >  currentSiz
1a790 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e );.        rc 
1a7a0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1a7b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d  (pPager->fd, pTm
1a7c0 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69  p, szPage, newSi
1a7d0 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  ze-szPage);.    
1a7e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1a7f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a800 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
1a810 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
1a820 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1a830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a850 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65  n a sanitized ve
1a860 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63  rsion of the sec
1a870 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66  tor-size of OS f
1a880 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a  ile pFile. The.*
1a890 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1a8a0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1a8b0 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61  lie between 32 a
1a8c0 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  nd MAX_SECTOR_SI
1a8d0 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ZE..*/.int sqlit
1a8e0 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  e3SectorSize(sql
1a8f0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1a900 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20  ){.  int iRet = 
1a910 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
1a920 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ize(pFile);.  if
1a930 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20  ( iRet<32 ){.   
1a940 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d   iRet = 512;.  }
1a950 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41  else if( iRet>MA
1a960 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
1a970 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
1a980 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
1a990 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20  2 );.    iRet = 
1a9a0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
1a9b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
1a9c0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  et;.}../*.** Set
1a9d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1a9e0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1a9f0 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20  ze variable for 
1aa00 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67  the given.** pag
1aa10 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
1aa20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1aa30 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1aa40 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
1aa50 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1aa60 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f   file. The secto
1aa70 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75  r size will be u
1aa80 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72  sed .** to deter
1aa90 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e  mine the size an
1aaa0 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a  d alignment of j
1aab0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e  ournal header an
1aac0 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  d .** master jou
1aad0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69  rnal pointers wi
1aae0 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75  thin created jou
1aaf0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
1ab00 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
1ab10 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74  files the effect
1ab20 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1ab30 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  is always 512 by
1ab40 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  tes..**.** Other
1ab50 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65  wise, for non-te
1ab60 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74  mporary files, t
1ab70 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1ab80 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74  tor size is.** t
1ab90 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1aba0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
1abb0 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f  Size() method ro
1abc0 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69  unded up to 32 i
1abd0 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
1abe0 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e  than 32, or roun
1abf0 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f  ded down to MAX_
1ac00 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69  SECTOR_SIZE if i
1ac10 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
1ac20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  than MAX_SECTOR_
1ac30 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  SIZE..**.** If t
1ac40 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20  he file has the 
1ac50 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1ac60 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1ac70 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
1ac80 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63  set.** the effec
1ac90 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1aca0 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20   to its minimum 
1acb0 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68  value (512).  Th
1acc0 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20  e purpose of.** 
1acd0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1ace0 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20  ze is to define 
1acf0 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75  the "blast radiu
1ad00 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  s" of bytes that
1ad10 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1ad20 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   if a crash occu
1ad30 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  rs while writing
1ad40 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74   to a single byt
1ad50 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e  e in.** that ran
1ad60 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f  ge.  But with PO
1ad70 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1ad80 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64  E, the blast rad
1ad90 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28  ius is zero.** (
1ada0 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57  that is what POW
1adb0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1adc0 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d   means), so we m
1add0 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74  inimize the sect
1ade0 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72  or.** size.  For
1adf0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
1ae00 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  tibility of the 
1ae10 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ae20 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a   file format,.**
1ae30 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63   we cannot reduc
1ae40 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1ae50 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f  sector size belo
1ae60 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  w 512..*/.static
1ae70 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
1ae80 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
1ae90 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
1aea0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1aeb0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1aec0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  File );..  if( p
1aed0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
1aee0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
1aef0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1af00 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1af10 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) & .           
1af20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1af30 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1af40 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ITE)!=0.  ){.   
1af50 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
1af60 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
1af70 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1af80 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
1af90 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
1afa0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1afb0 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
1afc0 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
1afd0 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
1afe0 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
1aff0 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  lt. */.    pPage
1b000 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1b010 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  512;.  }else{.  
1b020 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
1b030 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65  Size = sqlite3Se
1b040 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
1b050 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  >fd);.  }.}../*.
1b060 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
1b070 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
1b080 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1b090 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
1b0a0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
1b0b0 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
1b0c0 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
1b0d0 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
1b0e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b0f0 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
1b100 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
1b110 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
1b120 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
1b130 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
1b140 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
1b150 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1b160 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1b170 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
1b180 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
1b190 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
1b1a0 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
1b1b0 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1b1c0 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
1b1d0 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
1b1e0 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
1b1f0 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
1b200 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
1b210 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1b220 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1b230 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
1b240 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
1b250 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
1b260 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
1b270 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
1b280 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b290 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1b2a0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
1b2b0 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
1b2c0 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
1b2d0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
1b2e0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1b2f0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1b300 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
1b310 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
1b320 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
1b330 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
1b340 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
1b350 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1b360 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b370 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  s the page size.
1b380 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70  .**  (7)  zero p
1b390 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68  adding out to th
1b3a0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69  e next sector si
1b3b0 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72  ze..**  (8)  Zer
1b3c0 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
1b3d0 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
1b3e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
1b3f0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1b400 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1b410 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
1b420 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
1b430 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
1b440 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
1b450 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
1b460 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
1b470 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1b480 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
1b490 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76  rst 7 items abov
1b4a0 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
1b4b0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1b4c0 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
1b4d0 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a  f the 8th item..
1b4e0 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
1b4f0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
1b500 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
1b510 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
1b520 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
1b530 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
1b540 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1b550 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
1b560 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
1b570 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
1b580 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
1b590 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b5a0 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
1b5b0 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
1b5c0 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
1b5d0 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
1b5e0 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
1b5f0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1b600 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
1b610 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1b620 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
1b630 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1b640 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
1b650 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
1b660 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
1b670 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
1b680 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
1b690 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
1b6a0 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
1b6b0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
1b6c0 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
1b6d0 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
1b6e0 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
1b6f0 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
1b700 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
1b710 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
1b720 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
1b730 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
1b740 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
1b750 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
1b760 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
1b770 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
1b780 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
1b790 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
1b7a0 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
1b7b0 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
1b7c0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
1b7d0 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
1b7e0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
1b7f0 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
1b800 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
1b810 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
1b820 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
1b830 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
1b840 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
1b850 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
1b860 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
1b870 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
1b880 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
1b890 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
1b8a0 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
1b8b0 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
1b8c0 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
1b8d0 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
1b8e0 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
1b8f0 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
1b900 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
1b910 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
1b920 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
1b930 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
1b940 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
1b950 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
1b960 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1b970 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
1b980 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
1b990 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
1b9a0 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
1b9b0 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
1b9c0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
1b9d0 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
1b9e0 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
1b9f0 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
1ba00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1ba10 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ned..**.** The i
1ba20 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69  sHot parameter i
1ba30 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
1ba40 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1ba50 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ollback a journa
1ba60 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  l.** that might 
1ba70 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  be a hot journal
1ba80 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20  .  Or, it could 
1ba90 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  be that the jour
1baa0 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65  nal is .** prese
1bab0 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rved because of 
1bac0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
1bad0 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f  IST or JOURNALMO
1bae0 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20  DE_TRUNCATE..** 
1baf0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  If the journal r
1bb00 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65  eally is hot, re
1bb10 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61  set the pager ca
1bb20 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e  che prior rollin
1bb30 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f  g.** back any co
1bb40 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a  ntent.  If the j
1bb50 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79  ournal is merely
1bb60 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20   persistent, no 
1bb70 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64  reset is.** need
1bb80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1bb90 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
1bba0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1bbb0 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
1bbc0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1bbd0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
1bbe0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
1bbf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1bc00 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bc10 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
1bc20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc40 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
1bc50 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
1bc60 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
1bc90 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
1bca0 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
1bcb0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1bcc0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
1bcd0 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
1bce0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1bcf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1bd00 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
1bd10 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1bd20 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
1bd30 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1bd40 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1bd50 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
1bd60 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
1bd70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
1bd80 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
1bd90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
1bda0 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  ny */.  int need
1bdb0 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20  PagerReset;     
1bdc0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
1bdd0 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  t page prior to 
1bde0 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62  first page rollb
1bdf0 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c  ack */.  int nPl
1be00 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20  ayback = 0;     
1be10 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1be20 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f  r of pages resto
1be30 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  red from journal
1be40 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1be50 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
1be60 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
1be70 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
1be80 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
1be90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
1bea0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
1beb0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1bec0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
1bed0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1bee0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1bef0 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
1bf00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1bf10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1bf20 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
1bf30 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
1bf40 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
1bf50 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
1bf60 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
1bf70 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
1bf80 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1bf90 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
1bfa0 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
1bfb0 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
1bfc0 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
1bfd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1bfe0 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
1bff0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
1c000 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
1c010 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1c020 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
1c030 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
1c040 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
1c050 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
1c060 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
1c070 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
1c080 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
1c090 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
1c0a0 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
1c0b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1c0c0 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
1c0d0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
1c0e0 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
1c0f0 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
1c100 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1c110 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1c120 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1c130 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1c140 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1c150 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1c160 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1c170 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1c180 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1c190 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1c1a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1c1b0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1c1c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c1d0 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1c1e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1c1f0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1c200 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1c210 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1c220 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1c230 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1c240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1c250 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1c260 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c270 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1c280 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1c290 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1c2a0 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1c2b0 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1c2c0 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1c2d0 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1c2e0 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1c2f0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1c300 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1c310 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1c320 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1c330 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1c340 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1c350 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1c360 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1c370 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1c380 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1c390 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1c3a0 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1c3b0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1c3c0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1c3d0 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1c3e0 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1c3f0 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1c400 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1c410 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1c420 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1c430 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1c440 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1c450 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1c460 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1c470 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1c480 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1c490 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1c4a0 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1c4b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c4c0 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1c4d0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1c4e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c4f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c500 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1c510 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1c520 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1c530 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1c540 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1c550 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1c560 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1c570 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1c580 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1c590 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c5a0 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1c5b0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1c5c0 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1c5d0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1c5e0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1c5f0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1c600 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1c610 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1c620 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1c630 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c640 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1c650 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c660 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c670 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1c680 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1c690 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1c6a0 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1c6b0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c6c0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1c6d0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1c6e0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1c6f0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1c700 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1c710 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1c720 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1c730 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1c740 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1c750 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1c760 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1c770 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1c780 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1c790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1c7a0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1c7b0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1c7c0 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1c7d0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1c7e0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1c7f0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1c800 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1c810 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1c820 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1c830 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1c840 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1c850 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1c860 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1c870 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1c880 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1c890 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1c8a0 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1c8b0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1c8c0 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1c8d0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1c8e0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1c8f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1c900 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1c910 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1c920 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1c930 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1c940 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1c950 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1c960 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c970 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1c980 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1c990 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1c9a0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1c9b0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1c9c0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1c9d0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1c9e0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1c9f0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1ca00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1ca10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ca20 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1ca30 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1ca40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1ca50 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1ca60 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1ca70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1ca80 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1ca90 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1caa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1cab0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1cac0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1cad0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1cae0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1caf0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1cb00 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1cb10 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1cb20 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1cb30 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1cb40 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1cb50 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1cb60 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1cb70 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1cb80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1cb90 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1cba0 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1cbb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cbc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1cbd0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1cbe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1cbf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1cc00 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1cc10 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1cc20 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1cc30 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1cc40 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1cc50 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1cc60 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1cc70 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1cc80 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1cc90 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1cca0 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1ccb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1ccc0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1ccd0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1cce0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1ccf0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1cd00 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1cd10 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1cd20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cd30 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1cd40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cd50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  OK ){.        nP
1cd60 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  layback++;.     
1cd70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cd80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1cd90 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1cda0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cdb0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1cdc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cdd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1cde0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1cdf0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1ce00 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1ce10 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1ce20 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1ce30 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1ce40 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1ce50 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1ce60 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1ce70 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1ce80 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1ce90 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1cea0 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1ceb0 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1cec0 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1ced0 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1cee0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1cef0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1cf00 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1cf10 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1cf20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1cf30 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1cf40 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1cf50 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1cf60 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1cf70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cf80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1cf90 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1cfa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cfb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1cfc0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1cfd0 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1cfe0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1cff0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1d000 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1d010 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1d020 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1d030 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1d040 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1d050 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1d060 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1d070 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1d080 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1d090 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1d0a0 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1d0b0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1d0c0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1d0d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1d0e0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1d0f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d110 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1d120 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1d130 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1d140 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1d150 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1d160 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1d170 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1d180 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1d190 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1d1a0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1d1b0 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1d1c0 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1d1d0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1d1e0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1d1f0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1d200 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1d210 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1d220 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1d230 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1d240 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ied..  */.#ifdef
1d250 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1d260 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
1d270 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1d280 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1d290 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
1d2a0 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1d2b0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1d2c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1d2d0 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1d2e0 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1d2f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1d300 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1d310 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1d320 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1d330 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1d340 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d350 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1d360 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1d370 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1d380 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1d390 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1d3a0 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1d3b0 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1d3c0 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1d3d0 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1d3e0 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1d3f0 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1d400 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1d410 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1d420 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1d430 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1d440 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1d450 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1d460 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1d470 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1d480 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1d490 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1d4a0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1d4b0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1d4c0 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1d4d0 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1d4e0 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1d4f0 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1d500 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1d510 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1d520 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1d530 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1d540 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1d550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d560 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1d570 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1d580 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1d590 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1d5a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1d5b0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1d5c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1d5d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d5e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d5f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d600 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28  QLITE_OK.   && (
1d610 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1d620 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1d630 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1d640 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1d650 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
1d660 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1d670 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
1d680 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1d6a0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1d6b0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
1d6c0 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c  Master[0]!='\0',
1d6d0 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   0);.    testcas
1d6e0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1d6f0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1d700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1d710 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
1d720 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1d730 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
1d740 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
1d750 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1d760 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
1d770 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1d780 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
1d790 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1d7a0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
1d7b0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d7c0 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
1d7d0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1d7e0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1d7f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1d800 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50   if( isHot && nP
1d810 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  layback ){.    s
1d820 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
1d830 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
1d840 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f  _ROLLBACK, "reco
1d850 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66  vered %d pages f
1d860 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rom %s",.       
1d870 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61           nPlayba
1d880 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ck, pPager->zJou
1d890 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rnal);.  }..  /*
1d8a0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1d8b0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1d8c0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1d8d0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1d8e0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1d8f0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1d900 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1d910 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1d920 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1d930 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1d940 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1d950 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1d960 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1d970 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1d980 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d990 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1d9a0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1d9b0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1d9c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d9d0 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1d9e0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1d9f0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1da00 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1da10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1da20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1da30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1da40 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1da50 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1da60 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1da70 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1da80 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1da90 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1daa0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1dab0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1dac0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1dad0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1dae0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1daf0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1db00 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1db10 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1db20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1db30 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1db40 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33  e(PgHdr *pPg, u3
1db50 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67  2 iFrame){.  Pag
1db60 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1db70 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1db80 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1db90 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1dba0 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1dbb0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1dbc0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1dbd0 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1dbe0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1dbf0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1dc00 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1dc10 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1dc20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1dc30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1dc40 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1dc50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dc60 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1dc70 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1dc80 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1dc90 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1dca0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1dcb0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28  E_OMIT_WAL.  if(
1dcc0 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f   iFrame ){.    /
1dcd0 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68  * Try to pull th
1dce0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1dcf0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e  write-ahead log.
1dd00 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1dd10 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65  ite3WalReadFrame
1dd20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69  (pPager->pWal, i
1dd30 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67  Frame, pgsz, pPg
1dd40 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  ->pData);.  }els
1dd50 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1dd60 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1dd70 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1dd80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1dd90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1dda0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1ddb0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1ddc0 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1ddd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dde0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1ddf0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1de00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1de10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1de20 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1de30 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1de40 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1de50 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1de60 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1de70 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1de80 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1de90 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1dea0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1deb0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1dec0 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1ded0 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1dee0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1def0 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1df00 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1df10 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1df20 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1df30 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1df40 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1df50 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1df60 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1df70 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1df80 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1df90 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1dfa0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1dfb0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1dfc0 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1dfd0 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1dfe0 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1dff0 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1e000 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1e010 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1e020 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1e030 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1e040 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1e050 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1e060 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1e070 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1e080 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1e090 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31  noise equaling 1
1e0a0 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
1e0b0 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
1e0c0 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
1e0d0 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
1e0e0 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
1e0f0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
1e100 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e110 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
1e120 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e130 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
1e140 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
1e150 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
1e160 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
1e170 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1e180 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1e190 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1e1a0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1e1b0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
1e1c0 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1e1d0 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
1e1e0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
1e1f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
1e200 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1e210 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1e220 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1e230 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1e240 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1e250 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1e260 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1e270 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
1e280 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1e290 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1e2b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1e2c0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1e2d0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
1e2e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e2f0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76  .** Update the v
1e300 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
1e310 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66  ge-counter at of
1e320 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20  fsets 24 and 92 
1e330 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  in.** the header
1e340 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20   and the sqlite 
1e350 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
1e360 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
1e370 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e  ** This is an un
1e380 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
1e390 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  te.  See also th
1e3a0 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  e pager_incr_cha
1e3b0 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20  ngecounter().** 
1e3c0 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e  routine which on
1e3d0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1e3e0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66  hange-counter if
1e3f0 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61   the update is a
1e400 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65  ctually.** neede
1e410 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64  d, as determined
1e420 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e   by the pPager->
1e430 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1e440 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a  state variable..
1e450 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1e460 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1e470 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a  ecounter(PgHdr *
1e480 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e  pPg){.  u32 chan
1e490 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f  ge_counter;..  /
1e4a0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1e4b0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1e4c0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1e4d0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1e4e0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1e4f0 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1e500 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50  yte((u8*)pPg->pP
1e510 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e520 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73  )+1;.  put32bits
1e530 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e540 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1e550 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  counter);..  /* 
1e560 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
1e570 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
1e580 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
1e590 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a  ..99 and in.  **
1e5a0 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
1e5b0 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
1e5c0 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
1e5d0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
1e5e0 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69  ber.  ** is vali
1e5f0 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  d. */.  put32bit
1e600 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1e610 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65  Data)+92, change
1e620 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74  _counter);.  put
1e630 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1e640 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  Pg->pData)+96, S
1e650 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
1e660 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  MBER);.}..#ifnde
1e670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1e680 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
1e690 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1e6a0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
1e6b0 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  age that has alr
1e6c0 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72  eady been .** wr
1e6d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c  itten into the l
1e6e0 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57  og file when a W
1e6f0 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1e700 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1e710 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20  * Parameter iPg 
1e720 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
1e730 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e  er of said page.
1e740 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65   The pCtx argume
1e750 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c  nt .** is actual
1e760 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
1e770 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1e780 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ure..**.** If pa
1e790 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e  ge iPg is presen
1e7a0 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  t in the cache, 
1e7b0 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  and has no outst
1e7c0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1e7d0 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63  s,.** it is disc
1e7e0 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  arded. Otherwise
1e7f0 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  , if there are o
1e800 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
1e810 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65  anding.** refere
1e820 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63  nces, the page c
1e830 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64  ontent is reload
1e840 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1e850 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  base. If the.** 
1e860 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61  attempt to reloa
1e870 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1e880 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1e890 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c  equired and fail
1e8a0 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  s, .** return an
1e8b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e8c0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
1e8d0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
1e8e0 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64  tic int pagerUnd
1e8f0 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  oCallback(void *
1e900 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b  pCtx, Pgno iPg){
1e910 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e920 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1e930 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1e940 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20  *)pCtx;.  PgHdr 
1e950 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
1e960 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1e970 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20  ger) );.  pPg = 
1e980 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1e990 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1e9a0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1e9b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1e9c0 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1e9d0 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1e9e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1e9f0 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1ea00 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46  se{.      u32 iF
1ea10 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rame = 0;.      
1ea20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1ea30 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
1ea40 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  >pWal, pPg->pgno
1ea50 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
1ea60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ea70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1ea80 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1ea90 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
1eaa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1eab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1eac0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1ead0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
1eae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1eaf0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
1eb00 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20  otNull(pPg);.   
1eb10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1eb20 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1eb30 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1eb40 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1eb50 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1eb60 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1eb70 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1eb80 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1eb90 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1eba0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1ebb0 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1ebc0 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1ebd0 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1ebe0 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1ebf0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1ec00 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1ec10 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1ec20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1ec30 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1ec40 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1ec50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1ec60 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1ec70 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1ec80 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1ec90 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1eca0 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1ecb0 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1ecc0 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1ecd0 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1ece0 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1ecf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1ed00 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1ed10 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1ed20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ed30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ed40 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1ed50 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1ed60 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1ed70 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1ed80 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1ed90 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1eda0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1edd0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1ede0 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee00 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1ee10 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1ee20 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1ee30 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1ee40 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1ee50 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1ee60 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1ee70 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1ee80 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1ee90 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1eea0 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1eeb0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1eec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1eed0 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1eee0 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1eef0 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1ef00 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1ef10 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1ef20 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1ef30 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1ef40 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1ef50 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1ef60 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1ef70 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1ef80 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1ef90 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1efa0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1efb0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1efc0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1efd0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1efe0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1eff0 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
1f000 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  NT.  /* If this 
1f010 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54  is an CONCURRENT
1f020 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1f030 65 6e 20 70 61 67 65 20 31 20 6d 75 73 74 20 62  en page 1 must b
1f040 65 20 72 65 72 65 61 64 20 66 72 6f 6d 20 0a 20  e reread from . 
1f050 20 2a 2a 20 74 68 65 20 64 62 20 66 69 6c 65 2c   ** the db file,
1f060 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
1f070 6f 74 20 64 69 72 74 79 2e 20 54 68 69 73 20 69  ot dirty. This i
1f080 73 20 62 65 63 61 75 73 65 20 74 68 65 20 62 2d  s because the b-
1f090 74 72 65 65 20 6c 61 79 65 72 20 0a 20 20 2a 2a  tree layer .  **
1f0a0 20 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61 64   may have alread
1f0b0 79 20 7a 65 72 6f 65 64 20 74 68 65 20 6e 46 72  y zeroed the nFr
1f0c0 65 65 20 61 6e 64 20 69 54 72 75 6e 6b 20 68 65  ee and iTrunk he
1f0d0 61 64 65 72 20 66 69 65 6c 64 73 2e 20 20 2a 2f  ader fields.  */
1f0e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f0f0 45 5f 4f 4b 20 26 26 20 28 70 4c 69 73 74 3d 3d  E_OK && (pList==
1f100 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  0 || pList->pgno
1f110 21 3d 31 29 20 26 26 20 70 50 61 67 65 72 2d 3e  !=1) && pPager->
1f120 70 41 6c 6c 52 65 61 64 20 29 7b 0a 20 20 20 20  pAllRead ){.    
1f130 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
1f140 6c 6c 62 61 63 6b 28 28 76 6f 69 64 2a 29 70 50  llback((void*)pP
1f150 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 23 65  ager, 1);.  }.#e
1f160 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 70  ndif..  while( p
1f170 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1f180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1f190 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1f1a0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1f1b0 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1f1c0 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1f1d0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1f1e0 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1f1f0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1f200 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f210 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f220 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1f230 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1f240 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1f250 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1f260 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1f270 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1f280 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1f290 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1f2a0 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1f2b0 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1f2c0 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1f2d0 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1f2e0 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1f2f0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1f300 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1f310 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1f320 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1f330 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
1f340 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1f350 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
1f360 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
1f370 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
1f380 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
1f390 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
1f3a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f3b0 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1f3c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f3e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1f3f0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1f420 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1f430 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1f460 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1f470 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1f480 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1f490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f4a0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1f4b0 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
1f4c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f4e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1f4f0 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1f520 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a  ges in pList */.
1f530 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1f560 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a   over pages */..
1f570 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f580 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
1f590 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
1f5a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f5b0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1f5c0 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
1f5d0 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
1f5e0 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
1f5f0 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
1f600 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
1f610 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
1f620 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
1f630 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
1f640 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1f650 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72  ert( pList->pDir
1f660 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69  ty==0 || isCommi
1f670 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d  t );.  if( isCom
1f680 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mit ){.    /* If
1f690 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1f6a0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  on is being comm
1f6b0 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  itted, there is 
1f6c0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
1f6d0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70  ing.    ** any p
1f6e0 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e  ages with page n
1f6f0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
1f700 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e  han nTruncate in
1f710 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  to the WAL file.
1f720 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c  .    ** They wil
1f730 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  l never be read 
1f740 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53  by any client. S
1f750 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  o remove them fr
1f760 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20  om the pDirty.  
1f770 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20    ** list here. 
1f780 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  */.    PgHdr **p
1f790 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1f7a0 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
1f7b0 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1f7c0 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1f7d0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f7e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1f7f0 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1f800 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1f810 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1f820 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1f830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f840 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1f850 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1f860 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1f870 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1f880 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1f890 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1f8a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1f8b0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1f8c0 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1f8d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1f8e0 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1f8f0 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1f900 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f910 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1f920 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1f930 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1f940 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1f950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1f960 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1f970 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  {.    for(p=pLis
1f980 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1f990 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1f9a0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1f9b0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1f9c0 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1f9d0 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1f9e0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1f9f0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1fa00 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1fa10 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1fa20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1fa30 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1fa40 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1fa50 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1fa60 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1fa70 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1fa80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1fa90 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1faa0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1fab0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1fac0 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1fad0 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1fae0 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1faf0 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1fb00 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
1fb10 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
1fb20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
1fb30 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
1fb40 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
1fb50 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
1fb60 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
1fb70 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
1fb80 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
1fb90 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
1fba0 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
1fbb0 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
1fbc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fbd0 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
1fbe0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
1fbf0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1fc00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fc20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1fc30 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc50 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
1fc60 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
1fc70 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
1fc80 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1fc90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1fca0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fcb0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
1fcc0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1fcd0 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
1fce0 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
1fcf0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
1fd00 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
1fd10 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
1fd20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1fd30 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
1fd40 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
1fd50 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
1fd60 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
1fd70 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
1fd80 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
1fd90 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
1fda0 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
1fdb0 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
1fdc0 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
1fdd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
1fde0 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1fdf0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
1fe00 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1fe10 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
1fe20 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1fe30 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
1fe40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1fe50 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
1fe60 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
1fe70 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1fe80 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
1fe90 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
1fea0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
1feb0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
1fec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1fed0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1fee0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1fef0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1ff00 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1ff10 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1ff20 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1ff30 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1ff40 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1ff50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1ff60 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1ff70 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1ff80 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1ff90 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1ffa0 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1ffb0 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1ffc0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1ffd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1ffe0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1fff0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
20000 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
20010 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
20020 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
20030 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
20040 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
20050 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
20060 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
20070 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
20080 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20090 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
200a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
200b0 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
200c0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
200e0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
200f0 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
20100 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
20110 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
20120 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
20130 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
20140 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
20150 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
20160 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
20170 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
20180 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
20190 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
201a0 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
201b0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
201c0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
201d0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
201e0 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
201f0 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
20200 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
20210 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
20220 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
20230 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
20240 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
20250 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20260 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
20270 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
20280 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
20290 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e  ARED_LOCK );.  n
202a0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
202b0 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
202c0 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
202d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
202e0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
202f0 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ase is not avail
20300 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  able from the.  
20310 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  ** WAL sub-syste
20320 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  m, determine the
20330 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73   page counte bas
20340 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
20350 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
20360 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
20370 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
20380 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
20390 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67  ot an.  ** integ
203a0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
203b0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f  he page-size, ro
203c0 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c  und up the resul
203d0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  t..  */.  if( nP
203e0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36  age==0 ){.    i6
203f0 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
20400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20410 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69  ize of db file i
20420 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61  n bytes */.    a
20430 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
20440 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
20450 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
20460 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
20470 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
20480 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
20490 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
204a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b  pPager->fd, &n);
204b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
204c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
204d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
204e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
204f0 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
20500 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (n+pPager->pageS
20510 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d  ize-1) / pPager-
20520 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
20530 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
20540 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
20550 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
20560 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
20570 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
20580 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
20590 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
205a0 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
205b0 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
205c0 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
205d0 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
205e0 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
205f0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
20600 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
20610 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
20620 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
20630 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
20640 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
20650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20660 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _WAL./*.** Check
20670 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
20680 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
20690 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
206a0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
206b0 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69  ager.** exists i
206c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
206d0 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76  s not empy, or v
206e0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a  erify that the *
206f0 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  -wal file does.*
20700 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20  * not exist (by 
20710 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20  deleting it) if 
20720 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20730 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
20740 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
20750 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61  e is not empty a
20760 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  nd the *-wal fil
20770 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74  e exists, open t
20780 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57  he pager.** in W
20790 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65  AL mode.  If the
207a0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
207b0 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61  ty or if no *-wa
207c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
207d0 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72  d.** if no error
207e0 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
207f0 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
20800 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
20810 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  to.** PAGER_JOUR
20820 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a  NALMODE_WAL..**.
20830 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
20840 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  _OK or an error 
20850 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
20860 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64  caller must hold
20870 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
20880 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20890 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ile to call this
208a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65  .** function. Be
208b0 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49  cause an EXCLUSI
208c0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
208d0 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  b file is requir
208e0 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a  ed to delete .**
208f0 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65   a WAL on a none
20900 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c  -empty database,
20910 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
20920 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63  ere is no race c
20930 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74  ondition .** bet
20940 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73  ween the xAccess
20950 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20  () below and an 
20960 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20  xDelete() being 
20970 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65  executed by some
20980 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65   .** other conne
20990 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
209a0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61   int pagerOpenWa
209b0 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72  lIfPresent(Pager
209c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
209d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
209e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
209f0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
20a00 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
20a10 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
20a20 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
20a30 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
20a40 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
20a50 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a70 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
20a80 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
20a90 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ab0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
20ac0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
20ad0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
20ae0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
20af0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
20b00 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20b10 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
20b20 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20b30 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
20b40 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
20b50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a  ager->zWal, 0);.
20b60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20b70 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
20b80 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53  E_NOENT ) rc = S
20b90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
20ba0 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  isWal = 0;.    }
20bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
20bc0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20bd0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  (.          pPag
20be0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
20bf0 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ->zWal, SQLITE_A
20c00 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69  CCESS_EXISTS, &i
20c10 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20  sWal.      );.  
20c20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
20c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20c40 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
20c50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20c60 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
20c70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
20c80 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
20c90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20ca0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
20cb0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
20cc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
20cd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20ce0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
20cf0 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
20d00 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20d10 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
20d20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
20d30 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20d40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20d50 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
20d60 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
20d70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
20d80 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
20d90 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
20da0 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
20db0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
20dc0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
20dd0 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
20de0 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
20df0 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
20e00 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
20e10 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
20e20 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
20e30 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
20e40 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
20e50 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
20e60 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
20e70 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
20e80 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
20e90 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
20ea0 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
20eb0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
20ec0 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
20ed0 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
20ee0 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
20ef0 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
20f00 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
20f10 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
20f20 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20f30 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
20f40 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
20f50 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
20f60 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
20f70 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20f80 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
20f90 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20fa0 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
20fb0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
20fc0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
20fd0 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
20fe0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
20ff0 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
21000 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
21010 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
21020 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
21030 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
21040 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
21050 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
21060 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
21070 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
21080 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
21090 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
210a0 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
210b0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
210c0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
210d0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
210e0 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
210f0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
21100 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
21110 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
21120 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
21130 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
21140 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
21150 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
21160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21170 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
21180 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
21190 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
211a0 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
211b0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
211c0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
211d0 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
211e0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
211f0 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
21200 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
21210 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
21220 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
21230 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
21240 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
21250 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
21260 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
21270 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
21280 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
21290 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
212a0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
212b0 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
212c0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
212d0 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
212e0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
212f0 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
21300 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
21310 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
21320 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
21330 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
21340 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
21350 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
21360 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
21370 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
21380 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
21390 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
213a0 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
213b0 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
213c0 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
213d0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
213e0 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
213f0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
21400 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
21410 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
21420 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
21430 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21440 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
21450 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
21460 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
21470 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
21480 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
21490 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
214a0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
214b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
214c0 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
214e0 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
214f0 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
21500 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
21510 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21520 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
21530 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
21540 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
21550 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
21560 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
21570 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
21580 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
21590 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
215a0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
215b0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
215c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
215d0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
215e0 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
215f0 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
21600 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
21610 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
21620 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
21630 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
21640 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
21650 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
21660 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
21670 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
21680 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
21690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
216a0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
216b0 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
216c0 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
216d0 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
216e0 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
216f0 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
21700 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
21710 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
21720 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
21730 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
21740 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
21750 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
21760 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
21770 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
21780 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21790 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
217a0 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
217b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
217c0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
217d0 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
217e0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
217f0 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
21800 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
21810 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
21820 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
21830 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
21840 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
21850 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
21860 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
21870 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
21880 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
21890 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
218a0 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
218b0 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
218c0 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
218d0 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
218e0 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
218f0 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
21900 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
21910 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
21920 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
21930 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
21940 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
21950 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
21960 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
21970 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21980 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
21990 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
219a0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
219b0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
219c0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
219d0 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
219e0 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
219f0 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
21a00 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
21a10 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
21a20 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
21a30 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
21a40 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
21a50 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
21a60 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
21a70 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
21a80 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
21a90 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
21aa0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
21ab0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
21ac0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
21ad0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21ae0 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
21af0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
21b00 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
21b10 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
21b20 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
21b30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21b40 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
21b50 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
21b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21b70 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21b80 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
21b90 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21ba0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
21bb0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
21bc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21bd0 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
21be0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21bf0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21c00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21c10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21c20 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
21c30 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
21c40 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
21c50 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
21c60 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21c70 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
21c80 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
21c90 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
21ca0 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
21cb0 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
21cc0 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
21cd0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
21ce0 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
21cf0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
21d00 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
21d10 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
21d20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
21d30 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
21d40 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
21d50 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
21d60 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
21d70 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21d80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21d90 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
21da0 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
21db0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
21dc0 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
21dd0 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
21de0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
21df0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
21e00 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
21e10 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
21e20 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21e30 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
21e40 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
21e50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
21e60 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
21e70 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
21e80 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
21e90 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
21ea0 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
21eb0 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
21ec0 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
21ed0 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
21ee0 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
21ef0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
21f00 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
21f10 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
21f20 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
21f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
21f40 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
21f50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
21f60 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
21f70 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
21f80 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
21f90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
21fa0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
21fb0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
21fc0 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
21fd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
21fe0 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
21ff0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
22000 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
22010 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
22020 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
22030 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
22040 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
22050 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
22060 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22070 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
22080 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22090 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
220a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
220b0 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
220c0 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
220d0 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
220e0 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
220f0 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
22100 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
22110 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
22120 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
22130 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
22140 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
22150 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
22160 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
22170 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
22180 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
22190 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
221a0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
221b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
221c0 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
221d0 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76  fset = (i64)pSav
221e0 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
221f0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
22200 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
22210 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
22220 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
22230 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
22240 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
22250 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
22260 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
22270 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
22280 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
22290 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
222a0 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
222b0 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
222c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
222d0 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34  fset==(i64)ii*(4
222e0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
222f0 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
22300 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
22310 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
22320 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c   &offset, pDone,
22330 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
22340 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22350 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
22360 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
22370 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
22380 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
223a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
223b0 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   szJ;.  }..  ret
223c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
223d0 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
223e0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
223f0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
22400 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a  at are allowed.*
22410 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  * before attempt
22420 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63  ing to recycle c
22430 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20  lean and unused 
22440 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pages..*/.void s
22450 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
22460 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
22470 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
22480 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
22490 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
224a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
224b0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
224c0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
224d0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
224e0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
224f0 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
22500 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
22510 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70  pting to spill p
22520 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e  ages to journal.
22530 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22540 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65  agerSetSpillsize
22550 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22560 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72  int mxPage){.  r
22570 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
22580 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  cheSetSpillsize(
22590 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
225a0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
225b0 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45  ** Invoke SQLITE
225c0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
225d0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
225e0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73  rrent value of s
225f0 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  zMmap..*/.static
22600 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61   void pagerFixMa
22610 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  plimit(Pager *pP
22620 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54  ager){.#if SQLIT
22630 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
22640 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  0.  sqlite3_file
22650 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66   *fd = pPager->f
22660 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  d;.  if( isOpen(
22670 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68  fd) && fd->pMeth
22680 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
22690 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
226a0 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a  int64 sz;.    sz
226b0 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61   = pPager->szMma
226c0 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62  p;.    pPager->b
226d0 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30  UseFetch = (sz>0
226e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
226f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
22700 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
22710 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
22720 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65  ZE, &sz);.  }.#e
22730 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
22740 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
22750 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d   size of any mem
22760 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65  ory mapping made
22770 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22780 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
22790 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
227a0 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  apLimit(Pager *p
227b0 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69  Pager, sqlite3_i
227c0 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
227d0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
227e0 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72   szMmap;.  pager
227f0 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
22800 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  er);.}../*.** Fr
22810 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
22820 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
22830 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
22840 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22850 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
22860 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
22870 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
22880 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
22890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
228a0 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65   settings of the
228b0 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20   pager to those 
228c0 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
228d0 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74   pgFlags paramet
228e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c  er..**.** The "l
228f0 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73  evel" in pgFlags
22900 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   & PAGER_SYNCHRO
22910 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74  NOUS_MASK sets t
22920 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a  he robustness.**
22930 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22940 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
22950 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20  o OS crashes or 
22960 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
22970 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68  y.** changing th
22980 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
22990 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
229a0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a  g the journals..
229b0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72  ** There are thr
229c0 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
229d0 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
229e0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
229f0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
22a00 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
22a10 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
22a20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
22a30 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
22a40 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
22a50 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
22a60 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
22a70 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
22a80 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
22a90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22aa0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
22ab0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
22ac0 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
22ad0 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
22ae0 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
22af0 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
22b00 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
22b10 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
22b20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
22b30 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
22b40 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
22b50 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
22b60 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
22b70 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
22b80 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
22b90 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
22ba0 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
22bb0 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
22bc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
22bd0 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
22be0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22bf0 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
22c00 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22c10 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22c20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22c30 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
22c40 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
22c50 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
22c60 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
22c70 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
22c80 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
22c90 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
22ca0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
22cc0 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
22cd0 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
22ce0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
22cf0 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
22d00 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
22d10 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
22d20 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
22d30 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
22d40 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
22d50 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
22d60 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
22d70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22d80 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
22d90 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
22da0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
22db0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
22dc0 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
22dd0 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
22de0 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
22df0 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
22e00 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
22e10 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
22e20 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
22e30 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
22e40 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
22e50 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
22e60 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
22e70 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
22e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
22e90 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
22ea0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
22eb0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
22ec0 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
22ed0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
22ee0 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
22ef0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
22f00 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
22f10 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
22f20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
22f30 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
22f40 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
22f50 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
22f60 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
22f70 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
22f80 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
22f90 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
22fa0 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
22fb0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
22fc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22fd0 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44   NORMAL..**.** D
22fe0 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
22ff0 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
23000 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
23010 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
23020 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
23030 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
23040 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
23050 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
23060 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
23070 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
23080 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
23090 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
230a0 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
230b0 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
230c0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
230d0 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
230e0 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
230f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23100 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
23110 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
23120 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
23130 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
23140 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
23150 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
23160 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
23170 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
23180 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
23190 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
231a0 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
231b0 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
231c0 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
231d0 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
231e0 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
231f0 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
23200 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
23210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23220 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
23230 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
23240 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61  erSetFlags(.  Pa
23250 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23260 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
23270 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
23280 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e  evel for */.  un
23290 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
232a0 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
232b0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  lags */.){.  uns
232c0 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67  igned level = pg
232d0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
232e0 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a  NCHRONOUS_MASK;.
232f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
23300 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
23310 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31  ager->noSync = 1
23320 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
23330 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  llSync = 0;.    
23340 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
23350 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
23360 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
23370 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47  nc =  level==PAG
23380 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f  ER_SYNCHRONOUS_O
23390 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61  FF ?1:0;.    pPa
233a0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
233b0 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e  level>=PAGER_SYN
233c0 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31  CHRONOUS_FULL ?1
233d0 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  :0;.    pPager->
233e0 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65  extraSync = leve
233f0 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
23400 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b  NOUS_EXTRA ?1:0;
23410 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
23420 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
23430 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
23440 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  gs = 0;.    pPag
23450 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
23460 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  s = 0;.  }else i
23470 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
23480 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  ER_FULLFSYNC ){.
23490 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
234a0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
234b0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
234c0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
234d0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
234e0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
234f0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
23500 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59  GER_CKPT_FULLFSY
23510 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
23520 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
23530 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23540 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
23550 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
23560 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
23570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
23580 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
23590 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
235a0 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
235b0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
235c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
235d0 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
235e0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
235f0 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
23600 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
23610 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
23620 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
23630 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
23640 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
23650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c  ;.  }.  if( pgFl
23660 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48  ags & PAGER_CACH
23670 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50  ESPILL ){.    pP
23680 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
23690 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f   &= ~SPILLFLAG_O
236a0 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FF;.  }else{.   
236b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
236c0 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
236d0 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  _OFF;.  }.}.#end
236e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
236f0 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
23700 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
23710 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
23720 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
23730 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
23740 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
23750 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
23760 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
23770 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
23780 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
23790 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
237a0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
237b0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
237c0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
237d0 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
237e0 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
237f0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
23800 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
23810 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
23820 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23830 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
23840 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
23850 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
23860 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
23870 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
23880 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
23890 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
238a0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
238b0 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
238c0 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
238d0 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
238e0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
238f0 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
23900 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
23910 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
23920 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
23930 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23940 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
23950 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
23960 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23970 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
23980 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23990 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
239a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
239b0 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
239c0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
239d0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
239e0 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
239f0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
23a00 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
23a10 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
23a20 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
23a30 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
23a40 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
23a50 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
23a60 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
23a90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
23aa0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
23ab0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
23ac0 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
23ad0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
23ae0 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
23af0 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
23b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23b10 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
23b20 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
23b30 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23b40 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
23b50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23b60 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
23b70 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
23b80 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
23b90 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
23ba0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
23bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
23bc0 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
23bd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23be0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
23bf0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
23c00 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
23c10 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
23c20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
23c30 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
23c40 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
23c50 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
23c60 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
23c70 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
23c80 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
23c90 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
23ca0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
23cb0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
23cc0 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
23cd0 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
23ce0 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
23cf0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
23d00 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
23d10 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
23d20 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
23d30 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
23d40 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
23d50 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
23d60 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
23d70 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
23d80 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
23d90 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
23da0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
23db0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
23dc0 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
23dd0 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
23de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e10 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
23e20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
23e30 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
23e40 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
23e50 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
23e60 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
23e70 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
23e80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
23e90 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
23ea0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
23eb0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
23ec0 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
23ed0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
23ee0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
23ef0 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
23f00 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
23f10 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
23f20 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
23f30 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
23f40 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
23f50 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
23f60 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
23f70 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
23f80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
23f90 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
23fa0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
23fd0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
23fe0 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
23ff0 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
24000 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
24010 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
24020 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
24030 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
24040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
24050 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
24060 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
24070 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  /.){.  pPager->x
24080 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
24090 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
240a0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
240b0 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
240c0 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20  dlerArg;..  if( 
240d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
240e0 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
240f0 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26  *ap = (void **)&
24100 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
24110 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  dler;.    assert
24120 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20  ( ((int(*)(void 
24130 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75  *))(ap[0]))==xBu
24140 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20  syHandler );.   
24150 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
24160 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
24170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
24180 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
24190 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
241a0 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
241b0 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
241c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
241d0 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
241e0 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
241f0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
24200 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
24210 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
24220 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
24230 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
24240 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
24250 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
24260 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
24270 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
24280 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
24290 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
242a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
242b0 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
242c0 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
242d0 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
242e0 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
242f0 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
24300 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
24310 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
24320 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
24330 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
24340 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
24350 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
24360 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
24370 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
24380 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
24390 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
243a0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
243b0 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
243c0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
243d0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
243e0 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
243f0 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
24400 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
24410 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
24420 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
24430 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
24440 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
24450 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
24460 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
24470 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
24480 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
24490 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
244a0 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
244b0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
244c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
244d0 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
244e0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
244f0 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
24500 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
24510 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
24520 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
24530 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
24540 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
24550 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
24560 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
24570 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
24580 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
24590 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
245a0 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
245b0 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
245c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
245d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
245e0 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
245f0 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
24600 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
24610 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
24620 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
24630 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
24640 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
24650 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
24660 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
24670 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
24680 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
24690 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
246a0 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
246b0 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
246c0 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
246d0 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
246e0 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
246f0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
24700 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
24710 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
24720 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
24730 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
24740 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24750 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
24760 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
24770 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
24780 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
24790 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
247a0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
247b0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
247c0 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
247d0 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
247e0 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
247f0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
24800 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
24810 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
24820 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
24830 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
24840 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
24850 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
24860 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
24870 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
24880 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
24890 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
248a0 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
248b0 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
248c0 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
248d0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
248e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
248f0 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
24900 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
24910 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
24920 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
24930 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
24940 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
24950 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
24960 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
24970 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
24980 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
24990 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
249a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
249b0 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
249c0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
249d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
249e0 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
249f0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
24a00 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
24a10 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
24a20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
24a30 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
24a40 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
24a50 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
24a60 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
24a70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
24a80 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
24a90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24aa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
24ab0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
24ac0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
24ad0 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
24ae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24af0 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
24b00 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
24b10 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
24b20 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
24b30 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
24b40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24b50 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
24b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24b70 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
24b80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
24b90 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
24ba0 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
24bb0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
24bc0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
24bd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24be0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
24bf0 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
24c00 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
24c10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
24c20 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
24c30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
24c40 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Size = (Pgno)((n
24c50 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29  Byte+pageSize-1)
24c60 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  /pageSize);.    
24c70 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
24c80 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
24c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24ca0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
24cb0 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNew);.    }.  }
24cc0 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  ..  *pPageSize =
24cd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
24ce0 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
24cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24d00 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
24d10 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
24d20 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
24d30 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
24d40 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
24d50 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
24d60 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
24d70 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
24d80 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
24d90 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
24da0 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
24db0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
24dc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24dd0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
24de0 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
24df0 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
24e00 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
24e10 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
24e20 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
24e30 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
24e40 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
24e50 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
24e60 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
24e70 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
24e80 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
24e90 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
24ea0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
24eb0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
24ec0 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
24ed0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
24ee0 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
24ef0 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
24f00 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
24f10 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
24f20 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
24f30 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
24f40 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
24f50 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
24f60 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
24f70 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
24f80 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
24f90 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
24fa0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
24fb0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
24fc0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
24fd0 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
24fe0 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
24ff0 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
25000 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
25010 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
25020 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
25030 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
25040 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
25050 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
25060 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
25070 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
25080 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
25090 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
250a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
250b0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
250c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
250d0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
250e0 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
250f0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
25100 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61   mxPage;.  }.  a
25110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25120 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
25130 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c  N );      /* Cal
25140 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d  led only by OP_M
25150 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73  axPgcnt */.  ass
25160 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
25170 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno>=pPager->dbS
25180 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61  ize );  /* OP_Ma
25190 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20  xPgcnt enforces 
251a0 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e  this */.  return
251b0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
251c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
251d0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
251e0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
251f0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
25200 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
25210 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
25220 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
25230 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
25240 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
25250 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
25260 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
25270 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
25280 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
25290 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
252a0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
252b0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
252c0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
252d0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
252e0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
252f0 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
25300 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
25310 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
25320 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
25330 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
25340 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
25350 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
25360 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25370 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
25380 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
25390 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
253a0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
253b0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
253c0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
253d0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
253e0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
253f0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25400 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
25410 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
25420 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
25430 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
25440 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
25450 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25460 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
25470 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
25480 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
25490 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
254a0 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
254b0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
254c0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
254d0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
254e0 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
254f0 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
25500 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
25510 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
25520 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
25530 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
25540 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
25550 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
25560 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
25570 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
25580 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
25590 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
255a0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
255b0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
255c0 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
255d0 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
255e0 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
255f0 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
25600 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
25610 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
25620 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
25630 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
25640 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
25650 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
25660 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
25670 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
25680 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
25690 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
256a0 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
256b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
256c0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
256d0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
256e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
256f0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
25700 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
25710 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
25720 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
25730 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25740 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
25750 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
25760 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25770 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
25780 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  mpFile );..  /* 
25790 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
257a0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62  only called by b
257b0 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  tree immediately
257c0 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a   after creating.
257d0 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f    ** the Pager o
257e0 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61  bject.  There ha
257f0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70  s not been an op
25800 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61  portunity to tra
25810 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  nsition.  ** to 
25820 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20  WAL mode yet..  
25830 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
25840 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
25850 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70  ) );..  if( isOp
25860 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
25870 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
25880 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
25890 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
258a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
258b0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
258c0 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
258d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
258e0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
258f0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
25900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25910 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
25920 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
25930 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e   function may on
25940 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
25950 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
25960 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a  tion is open on.
25970 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  ** the pager. It
25980 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
25990 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
259a0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
259b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65  se..**.** Howeve
259c0 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
259d0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
259e0 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
259f0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
25a00 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
25a10 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
25a20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
25a30 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
25a40 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
25a50 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
25a60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25a70 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
25a80 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
25a90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25aa0 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
25ab0 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
25ac0 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
25ad0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d  Pager->dbSize;.}
25ae0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
25af0 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
25b00 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
25b10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25b20 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
25b30 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
25b40 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
25b50 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
25b60 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
25b70 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
25b80 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
25b90 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
25ba0 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
25bb0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
25bc0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
25bd0 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
25be0 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
25bf0 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
25c00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
25c10 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
25c20 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
25c30 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
25c40 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
25c50 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
25c60 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
25c70 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
25c80 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
25c90 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
25ca0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
25cb0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
25cc0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
25cd0 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
25ce0 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
25cf0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
25d00 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
25d10 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
25d20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
25d30 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
25d40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
25d50 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
25d60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25d70 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
25d80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
25db0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  de */..  /* Chec
25dc0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
25dd0 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
25de0 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
25df0 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
25e00 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29  ** already held)
25e10 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
25e20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74  transitions that
25e30 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
25e40 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
25e50 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
25e60 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
25e70 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
25e80 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
25e90 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
25ea0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
25eb0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
25ec0 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
25ed0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
25ee0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
25ef0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
25f00 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
25f10 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
25f20 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
25f30 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
25f40 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
25f50 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
25f60 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
25f70 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  er, locktype);. 
25f80 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
25f90 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
25fa0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
25fb0 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
25fc0 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72  ndlerArg) );.  r
25fd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25fe0 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
25ff0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26000 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
26010 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
26020 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
26030 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
26040 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
26050 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
26060 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
26070 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
26080 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
26090 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
260a0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
260b0 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
260c0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
260d0 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
260e0 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
260f0 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
26100 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
26110 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
26120 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
26130 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
26140 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
26150 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
26160 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
26170 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
26180 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
26190 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
261a0 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
261b0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
261c0 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
261d0 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
261e0 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
261f0 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
26200 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
26210 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
26220 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
26230 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
26240 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
26250 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
26260 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
26270 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
26280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26290 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
262a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
262b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
262c0 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
262d0 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
262e0 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20   behavior would 
262f0 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
26300 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
26310 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
26320 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
26330 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
26340 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
26350 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
26360 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
26370 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
26380 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
26390 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
263a0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
263b0 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
263c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
263d0 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
263e0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
263f0 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
26400 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
26410 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
26420 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
26430 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
26440 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
26450 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
26460 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
26470 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26480 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
26490 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
264a0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
264b0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
264c0 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
264d0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
264e0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
264f0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
26500 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
26510 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26520 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
26530 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
26540 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
26550 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
26560 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
26570 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
26580 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
26590 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
265a0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
265b0 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
265c0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
265d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
265e0 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
265f0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
26600 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
26610 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
26620 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
26630 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
26640 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
26650 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
26660 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
26670 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
26680 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
26690 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
266a0 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
266b0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
266c0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
266d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
266e0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
266f0 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
26700 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
26710 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63  nsaction..** Onc
26720 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
26730 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  has been called,
26740 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
26750 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 0a   must either be.
26760 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ** rolled back o
26770 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20  r committed. It 
26780 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63  is not safe to c
26790 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
267a0 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f  n and.** then co
267b0 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74  ntinue writing t
267c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
267d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
267e0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
267f0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
26800 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
26810 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26820 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
26830 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26840 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
26850 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
26860 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
26870 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20  Size = nPage;.. 
26880 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   /* At one point
26890 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 63   the code here c
268a0 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e  alled assertTrun
268b0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
268c0 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
268d0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62  that all pages b
268e0 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61  eing truncated a
268f0 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65 72  way by this oper
26900 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20  ation are,.  ** 
26910 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  if one or more s
26920 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70  avepoints are op
26930 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74  en, present in t
26940 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
26950 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ** journal so th
26960 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
26970 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73  estored if the s
26980 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c  avepoint is roll
26990 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68  ed.  ** back. Th
269a0 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  is is no longer 
269b0 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 69  necessary as thi
269c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
269d0 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c  w only.  ** call
269e0 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20  ed right before 
269f0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
26a00 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74  nsaction. So alt
26a10 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20  hough the .  ** 
26a20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79  Pager object may
26a30 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e   still have open
26a40 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67   savepoints (Pag
26a50 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30  er.nSavepoint!=0
26a60 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61  ), .  ** they ca
26a70 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
26a80 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65  ack. So the asse
26a90 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26aa0 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a  aint() call.  **
26ab0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f   is no longer co
26ac0 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  rrect. */.}.../*
26ad0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26ae0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
26af0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
26b00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
26b10 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
26b20 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
26b30 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
26b40 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
26b50 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
26b60 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
26b70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
26b80 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
26b90 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
26ba0 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
26bb0 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
26bc0 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
26bd0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
26be0 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
26bf0 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
26c00 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
26c10 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
26c20 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
26c30 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
26c40 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
26c50 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
26c60 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
26c70 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
26c80 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
26c90 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
26ca0 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
26cb0 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
26cc0 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
26cd0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
26ce0 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
26cf0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
26d00 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
26d10 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
26d20 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
26d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26d40 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
26d50 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
26d60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26d70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
26d80 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
26d90 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
26da0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
26db0 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
26dc0 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
26dd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26de0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
26df0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
26e00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
26e10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26e20 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
26e30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62   rc;.}../*.** Ob
26e40 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
26e50 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70   to a memory map
26e60 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  ped page object 
26e70 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
26e80 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65  pgno. .** The ne
26e90 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73  w object will us
26ea0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44  e the pointer pD
26eb0 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72  ata, obtained fr
26ec0 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20  om xFetch()..** 
26ed0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
26ee0 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
26ef0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
26f00 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
26f10 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
26f20 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
26f30 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
26f40 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
26f50 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
26f60 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
26f70 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
26f80 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
26f90 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
26fa0 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
26fb0 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
26fc0 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
26fd0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
26fe0 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
26ff0 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50  uireMapPage(.  P
27000 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27020 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
27030 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27050 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
27060 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  er */.  void *pD
27070 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
27080 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
27090 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74  h()'d data for t
270a0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
270b0 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20  Hdr **ppPage    
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
270d0 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70   OUT: Acquired p
270e0 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  age object */.){
270f0 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
27120 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75  ped page to retu
27130 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70  rn */.  .  if( p
27140 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27150 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50  list ){.    *ppP
27160 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72  age = p = pPager
27170 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27180 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  .    pPager->pMm
27190 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e  apFreelist = p->
271a0 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70  pDirty;.    p->p
271b0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d  Dirty = 0;.    m
271c0 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c  emset(p->pExtra,
271d0 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
271e0 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
271f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20    *ppPage = p = 
27200 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33  (PgHdr *)sqlite3
27210 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
27220 66 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65  f(PgHdr) + pPage
27230 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
27240 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
27250 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
27260 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
27270 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
27280 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
27290 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72   pData);.      r
272a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
272b0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  EM;.    }.    p-
272c0 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20  >pExtra = (void 
272d0 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e  *)&p[1];.    p->
272e0 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d  flags = PGHDR_MM
272f0 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20  AP;.    p->nRef 
27300 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67  = 1;.    p->pPag
27310 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d  er = pPager;.  }
27320 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
27330 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26  Extra==(void *)&
27340 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  p[1] );.  assert
27350 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b  ( p->pPage==0 );
27360 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c  .  assert( p->fl
27370 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20  ags==PGHDR_MMAP 
27380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27390 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
273a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
273b0 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e  Ref==1 );..  p->
273c0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
273d0 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
273e0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
273f0 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e  Out++;..  return
27400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27410 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
27420 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
27430 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68   pPg. pPg must h
27440 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ave been returne
27450 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c  d by an .** earl
27460 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ier call to page
27470 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
27480 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27490 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  d pagerReleaseMa
274a0 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  pPage(PgHdr *pPg
274b0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
274c0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
274d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
274e0 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70  pOut--;.  pPg->p
274f0 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
27500 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
27510 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
27520 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20  eelist = pPg;.. 
27530 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27540 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69  >fd->pMethods->i
27550 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20  Version>=3 );.  
27560 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
27570 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
27580 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  4)(pPg->pgno-1)*
27590 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
275a0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d  , pPg->pData);.}
275b0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
275c0 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
275d0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
275e0 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  er.pMmapFreelist
275f0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
27600 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d   void pagerFreeM
27610 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50  apHdrs(Pager *pP
27620 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
27630 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  p;.  PgHdr *pNex
27640 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  t;.  for(p=pPage
27650 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27660 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
27670 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
27680 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
27690 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
276a0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  .../*.** Shutdow
276b0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
276c0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
276d0 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
276e0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
276f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
27700 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
27710 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27720 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
27730 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
27740 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
27750 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
27760 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
27770 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
27780 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
27790 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
277a0 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
277b0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
277c0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
277d0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
277e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
277f0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
27800 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
27810 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
27820 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
27830 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
27840 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
27850 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
27860 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
27870 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
27880 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
27890 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
278a0 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
278b0 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
278c0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
278d0 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
278e0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
278f0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
27900 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27910 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
27920 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70  ger){.  u8 *pTmp
27930 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
27940 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61  >pTmpSpace;..  a
27950 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
27960 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
27970 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73  ) );.  disable_s
27980 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
27990 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
279a0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
279b0 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d  ();.  pagerFreeM
279c0 61 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a  apHdrs(pPager);.
279d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
279e0 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
279f0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
27a00 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
27a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
27a20 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
27a30 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
27a40 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  , pPager->ckptSy
27a50 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d  ncFlags, pPager-
27a60 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29  >pageSize, pTmp)
27a70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
27a80 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
27a90 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
27aa0 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
27ab0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
27ac0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
27ad0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
27ae0 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
27af0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27b00 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
27b10 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
27b20 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
27b30 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
27b40 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
27b50 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
27b60 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
27b70 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
27b80 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
27b90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
27ba0 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
27bb0 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
27bc0 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
27bd0 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
27be0 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
27bf0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
27c00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
27c10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
27c20 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
27c30 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
27c40 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
27c50 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
27c60 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
27c70 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
27c80 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
27c90 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
27ca0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
27cb0 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
27cc0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
27cd0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
27ce0 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
27cf0 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
27d00 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
27d10 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
27d20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
27d30 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
27d40 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
27d50 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
27d60 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
27d70 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
27d80 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
27d90 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
27da0 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
27db0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
27dc0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
27dd0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
27de0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
27df0 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
27e00 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
27e10 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
27e20 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
27e30 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
27e40 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
27e50 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
27e60 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
27e70 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
27e80 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
27e90 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
27ea0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
27eb0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
27ec0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
27ed0 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
27ee0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
27ef0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
27f00 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
27f10 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
27f20 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
27f30 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
27f40 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
27f50 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
27f60 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
27f70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
27f80 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
27fa0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27fb0 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
27fc0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
27fd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27fe0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
27ff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
28000 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
28010 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
28020 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
28030 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
28040 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
28050 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
28060 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
28070 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
28080 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
28090 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
280a0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
280b0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
280c0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
280d0 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
280e0 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
280f0 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
28100 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
28110 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
28120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
28130 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
28140 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
28150 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
28160 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
28170 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
28180 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
28190 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
281a0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
281b0 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
281c0 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
281d0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
281e0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
281f0 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
28200 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  oSync flag is se
28210 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
28220 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
28230 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
28240 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
28250 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
28260 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
28270 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69  and the .** devi
28280 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
28290 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73  cs of the file-s
282a0 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
282b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
282c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
282d0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
282e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
282f0 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
28300 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
28310 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
28320 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
28330 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
28340 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
28350 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
28360 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
28370 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
28380 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
28390 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
283a0 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
283b0 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
283c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
283d0 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
283e0 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
283f0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
28400 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
28410 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
28420 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
28430 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
28440 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
28450 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
28460 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
28470 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
28480 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
28490 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
284a0 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
284b0 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
284c0 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
284d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
284e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
284f0 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
28500 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
28510 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
28520 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
28530 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
28540 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
28550 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
28560 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
28570 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
28580 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
28590 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
285a0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
285b0 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
285c0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
285d0 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
285e0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
285f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  this routine cle
28600 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ars the PGHDR_NE
28610 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20  ED_SYNC flag of 
28620 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63  every .** page c
28630 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
28640 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72   memory before r
28650 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
28660 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20  OK. If an IO.** 
28670 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
28680 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49  ered, then the I
28690 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
286a0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
286b0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
286c0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
286d0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
286e0 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20   int newHdr){.  
286f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
28720 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
28730 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
28740 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
28750 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
28760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
28770 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
28780 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
28790 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
287a0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
287b0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
287c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
287d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
287e0 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
287f0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
28800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28810 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
28820 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
28830 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
28840 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
28850 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
28860 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28870 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
28880 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
28890 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
288a0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63  EMORY ){.      c
288b0 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
288c0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
288d0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
288e0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
288f0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
28900 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
28910 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
28920 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28930 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
28940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
28950 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
28960 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62   an obscure prob
28970 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74  lem. If the last
28980 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
28990 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74      ** that wrot
289a0 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  e to this databa
289b0 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67  se was operating
289c0 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a   in persistent-j
289d0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
289e0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  * mode, then the
289f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
28a00 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
28a10 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67  actually be larg
28a20 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
28a30 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  an Pager.journal
28a40 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68  Off bytes. If th
28a50 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20  e next thing in 
28a60 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
28a70 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70      ** file happ
28a80 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72  ens to be a jour
28a90 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74  nal-header (writ
28aa0 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74  ten as part of t
28ab0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
28ac0 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f  evious connectio
28ad0 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  n's transaction)
28ae0 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72  , and a crash or
28af0 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a   power-failure .
28b00 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72          ** occur
28b10 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20  s after nRec is 
28b20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f  updated but befo
28b30 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  re this connecti
28b40 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20  on writes .     
28b50 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65     ** anything e
28b60 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  lse to the journ
28b70 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d  al file (or comm
28b80 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69  its/rolls back i
28b90 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts .        ** t
28ba0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65  ransaction), the
28bb0 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63  n SQLite may bec
28bc0 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65  ome confused whe
28bd0 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20  n doing the .   
28be0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
28bf0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  nal rollback fol
28c00 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e  lowing recovery.
28c10 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63   It may roll bac
28c20 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  k all.        **
28c30 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
28c40 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20  ions data, then 
28c50 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69  proceed to rolli
28c60 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c  ng back the old,
28c70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d  .        ** out-
28c80 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61  of-date data tha
28c90 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61  t follows it. Da
28ca0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
28cb0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
28cc0 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b        ** To work
28cd0 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
28ce0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28cf0 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f  e does appear to
28d00 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20   contain.       
28d10 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64   ** a valid head
28d20 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67  er following Pag
28d30 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74  er.journalOff, t
28d40 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30  hen write a 0x00
28d50 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
28d60 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
28d70 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69   it to prevent i
28d80 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63  t from being rec
28d90 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20  ognized..       
28da0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56   **.        ** V
28db0 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72  ariable iNextHdr
28dc0 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
28dd0 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77   the offset at w
28de0 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20  hich this.      
28df0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63    ** problematic
28e00 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63   header will occ
28e10 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ur, if it exists
28e20 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64  . aMagic is used
28e30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20   .        ** as 
28e40 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
28e50 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68  er to inspect th
28e60 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f  e first couple o
28e70 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20  f bytes of.     
28e80 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74     ** the potent
28e90 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ial journal head
28ea0 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
28eb0 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74         i64 iNext
28ec0 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
28ed0 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
28ee0 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61  .        u8 zHea
28ef0 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28f00 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20  nalMagic)+4];.. 
28f10 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48         memcpy(zH
28f20 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
28f30 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
28f40 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
28f50 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
28f60 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
28f70 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
28f80 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
28f90 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64  .        iNextHd
28fa0 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61  rOffset = journa
28fb0 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
28fc0 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r);.        rc =
28fd0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
28fe0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
28ff0 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
29000 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
29010 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29020 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
29030 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
29040 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
29050 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
29060 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
29070 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
29080 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
29090 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
290a0 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
290b0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
290c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
290d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
290e0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
290f0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
29100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
29110 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
29120 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
29130 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
29140 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
29150 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
29160 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
29170 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
29180 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
29190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
291a0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
291b0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
291c0 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
291d0 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
291e0 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
291f0 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
29200 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
29210 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
29220 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
29230 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29240 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
29250 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
29260 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
29270 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
29280 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
29290 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
292a0 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
292b0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
292c0 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
292d0 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
292e0 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
292f0 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
29300 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
29310 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
29320 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
29330 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
29340 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
29350 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
29360 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
29370 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
29380 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29390 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
293a0 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
293b0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
293c0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
293d0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
293e0 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
293f0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
29400 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
29410 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
29420 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
29430 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
29440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29450 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
29460 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
29470 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
29480 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29490 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
294a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
294b0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
294c0 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
294d0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
294e0 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
294f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29500 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
29510 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
29520 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
29530 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
29540 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
29550 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29570 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29590 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
295a0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
295b0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
295c0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
295d0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
295e0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
295f0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
29600 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
29610 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
29620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29630 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
29640 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
29650 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  ncFlags| .      
29660 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
29670 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  cFlags==SQLITE_S
29680 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
29690 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
296a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
296b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
296c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
296d0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
296e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
296f0 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
29700 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20  ournalOff;.     
29710 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30   if( newHdr && 0
29720 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29730 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
29740 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
29750 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
29760 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
29770 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
29780 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
29790 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
297a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
297b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
297c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
297d0 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
297e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
297f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c   }.  }..  /* Unl
29800 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
29810 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c   in noSync mode,
29820 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29830 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a  e was just .  **
29840 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
29850 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  nced. Either way
29860 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  , clear the PGHD
29870 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
29880 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61   on .  ** all pa
29890 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ges..  */.  sqli
298a0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
298b0 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
298c0 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67  pPCache);.  pPag
298d0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
298e0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b  ER_WRITER_DBMOD;
298f0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
29900 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
29910 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
29920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29930 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
29940 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
29950 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
29960 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
29970 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20  connected.** by 
29980 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
29990 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66   pointer. This f
299a0 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65  unction writes e
299b0 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  ach one of the.*
299c0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  * in-memory page
299d0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f  s in the list to
299e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
299f0 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
29a00 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c   may.** be NULL,
29a10 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
29a20 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20   empty list. In 
29a30 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
29a40 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  unction is.** a 
29a50 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
29a60 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64   pager must hold
29a70 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
29a80 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74  RVED lock when t
29a90 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
29aa0 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72  is called. Befor
29ab0 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69  e writing anythi
29ac0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
29ad0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f  se file, this lo
29ae0 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65  ck.** is upgrade
29af0 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
29b00 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  E lock. If the l
29b10 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
29b20 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  tained,.** SQLIT
29b30 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
29b40 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69  ed and no data i
29b50 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
29b60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29b70 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
29b80 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ger is a temp-fi
29b90 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  le pager and the
29ba0 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73   actual file-sys
29bb0 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e  tem file.** is n
29bc0 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20  ot yet open, it 
29bd0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f  is created and o
29be0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79  pened before any
29bf0 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69   data is .** wri
29c00 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  tten out..**.** 
29c10 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  Once the lock ha
29c20 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20  s been upgraded 
29c30 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
29c40 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  y, the file open
29c50 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ed,.** the pages
29c60 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74   are written out
29c70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29c80 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72   file in list or
29c90 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20  der. Writing.** 
29ca0 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65  a page is skippe
29cb0 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69  d if it meets ei
29cc0 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ther of the foll
29cd0 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a  owing criteria:.
29ce0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
29cf0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  ge number is gre
29d00 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e  ater than Pager.
29d10 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20  dbSize, or.**   
29d20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  * The PGHDR_DONT
29d30 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73  _WRITE flag is s
29d40 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  et on the page..
29d50 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67  **.** If writing
29d60 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73   out a page caus
29d70 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
29d80 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61  file to grow, Pa
29d90 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ger.dbFileSize.*
29da0 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  * is updated acc
29db0 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67  ordingly. If pag
29dc0 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f  e 1 is written o
29dd0 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ut, then the val
29de0 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20  ue cached.** in 
29df0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
29e00 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  [] is updated to
29e10 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76   match the new v
29e20 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
29e30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
29e40 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
29e50 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
29e60 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
29e70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
29e80 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
29e90 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  * occurs, an IO 
29ea0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29eb0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
29ec0 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
29ed0 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f  k cannot.** be o
29ee0 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f  btained, SQLITE_
29ef0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
29f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f10 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
29f20 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67  list(Pager *pPag
29f30 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74  er, PgHdr *pList
29f40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
29f50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
29f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29f70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
29f80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
29f90 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
29fa0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  or rollback page
29fb0 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  rs in WRITER_DBM
29fc0 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  OD state. */.  a
29fd0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
29fe0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
29ff0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a000 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2a010 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20  RITER_DBMOD );. 
2a020 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a030 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
2a040 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
2a050 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
2a060 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
2a070 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
2a080 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
2a090 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
2a0a0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
2a0b0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
2a0c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2a0d0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
2a0e0 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
2a0f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
2a100 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2a110 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
2a120 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2a130 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
2a140 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a150 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
2a160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2a170 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
2a180 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
2a190 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2a1a0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
2a1b0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
2a1c0 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
2a1d0 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
2a1e0 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
2a1f0 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
2a200 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
2a210 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
2a220 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2a230 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2a240 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2a250 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50  ITE_OK .   && pP
2a260 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2a270 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a  <pPager->dbSize.
2a280 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44     && (pList->pD
2a290 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  irty || pList->p
2a2a0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69  gno>pPager->dbHi
2a2b0 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  ntSize).  ){.   
2a2c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
2a2d0 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
2a2e0 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
2a2f0 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
2a300 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
2a310 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2a320 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
2a330 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
2a340 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
2a350 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
2a360 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
2a370 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2a380 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
2a390 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2a3a0 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
2a3b0 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
2a3c0 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
2a3d0 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
2a3e0 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
2a3f0 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
2a400 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
2a410 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
2a420 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
2a430 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
2a440 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
2a450 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
2a460 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
2a470 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
2a480 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
2a490 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
2a4a0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
2a4b0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
2a4c0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
2a4d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
2a4e0 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
2a4f0 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
2a500 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
2a510 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
2a520 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
2a530 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
2a540 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
2a550 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
2a560 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
2a570 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
2a580 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
2a590 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
2a5a0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
2a5b0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
2a5c0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
2a5d0 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
2a5e0 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
2a5f0 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2a620 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
2a630 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2a640 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2a650 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2a660 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2a670 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
2a680 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
2a690 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
2a6a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
2a6b0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
2a6c0 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
2a6d0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
2a6e0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
2a6f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a700 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  EM, pData);..   
2a710 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
2a720 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
2a730 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2a740 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2a750 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
2a760 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2a770 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
2a780 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
2a790 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
2a7a0 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
2a7b0 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
2a7c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
2a7d0 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
2a7e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a7f0 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
2a800 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
2a810 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
2a820 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2a830 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
2a840 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
2a850 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
2a860 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
2a870 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2a880 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
2a890 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
2a8a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2a8b0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
2a8c0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
2a8d0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2a8e0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2a8f0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
2a900 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
2a910 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
2a920 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
2a930 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  E]++;..      /* 
2a940 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
2a950 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
2a960 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2a970 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
2a980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
2a990 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
2a9a0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
2a9b0 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
2a9c0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
2a9d0 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
2a9e0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
2a9f0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
2aa10 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2aa20 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
2aa30 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
2aa40 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
2aa50 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
2aa60 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
2aa70 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
2aa80 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2aa90 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
2aaa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
2aab0 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
2aac0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
2aad0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2aae0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
2aaf0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
2ab00 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
2ab10 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
2ab20 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
2ab30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ab40 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
2ab50 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ab60 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
2ab70 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
2ab80 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
2ab90 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2aba0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
2abb0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2abc0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
2abd0 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
2abe0 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
2abf0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
2ac00 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2ac10 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
2ac20 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
2ac30 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
2ac40 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
2ac50 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
2ac60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2ac70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ac80 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2ac90 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2aca0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2acb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2acc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2acd0 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
2ace0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2acf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
2ad00 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2ad10 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
2ad20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2ad30 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
2ad40 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
2ad50 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
2ad60 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
2ad70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2ad80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
2ad90 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
2ada0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2adb0 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
2adc0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2add0 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  l. .**.** If suc
2ade0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
2adf0 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
2ae00 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
2ae10 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
2ae20 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
2ae30 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
2ae40 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2ae50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2ae60 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2ae70 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
2ae80 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
2ae90 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
2aea0 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
2aeb0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
2aec0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
2aed0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
2aee0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
2aef0 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
2af00 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
2af10 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
2af20 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
2af30 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2af40 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
2af50 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2af60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
2af70 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2af80 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
2af90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2afa0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2afb0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
2afc0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
2afd0 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
2afe0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
2aff0 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
2b000 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b010 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2b020 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2b030 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2b040 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
2b050 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
2b060 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2b070 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
2b080 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
2b090 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b0a0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2b0b0 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
2b0c0 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
2b0d0 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20  pPager, pPg) .  
2b0e0 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70         || pPg->p
2b0f0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
2b100 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20  igSize .    );. 
2b110 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
2b120 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2b130 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2b140 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f  ub-journal was o
2b150 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  pened successful
2b160 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61  ly (or was alrea
2b170 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a  dy open),.    **
2b180 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e   write the journ
2b190 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  al record into t
2b1a0 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  he file.  */.   
2b1b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b1c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  OK ){.      void
2b1d0 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
2b1e0 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20  Data;.      i64 
2b1f0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50  offset = (i64)pP
2b200 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34  ager->nSubRec*(4
2b210 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
2b220 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e);.      char *
2b230 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20  pData2;.  .     
2b240 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2b250 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
2b260 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
2b270 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
2b280 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  );.      PAGERTR
2b290 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
2b2a0 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
2b2b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2b2c0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2b2d0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
2b2e0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
2b2f0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  jfd, offset, pPg
2b300 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
2b310 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b320 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b330 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2b340 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
2b350 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
2b360 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
2b370 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2b380 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2b390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b3a0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
2b3b0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
2b3c0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2b3d0 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
2b3e0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
2b3f0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
2b400 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
2b410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
2b420 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2b430 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2b440 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2b450 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2b460 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2b470 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e   return subjourn
2b480 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d  alPage(pPg);.  }
2b490 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2b4a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2b4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2b4c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2b4d0 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
2b4e0 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
2b4f0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
2b500 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
2b510 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
2b520 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
2b530 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
2b540 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
2b550 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
2b560 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
2b570 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
2b580 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
2b590 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
2b5a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2b5b0 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
2b5c0 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
2b5d0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
2b5e0 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
2b5f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2b600 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
2b610 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
2b620 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2b630 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
2b640 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
2b650 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
2b660 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
2b670 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2b680 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
2b690 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
2b6a0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
2b6b0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2b6c0 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
2b6d0 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
2b6e0 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
2b6f0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2b700 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
2b710 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
2b720 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2b730 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
2b740 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
2b750 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2b760 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2b770 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2b780 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
2b790 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
2b7a0 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
2b7b0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2b7c0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
2b7d0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
2b7e0 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
2b7f0 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
2b800 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2b810 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2b820 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
2b830 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
2b840 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
2b850 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
2b860 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
2b870 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
2b880 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2b890 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
2b8a0 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
2b8b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2b8c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2b8d0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
2b8e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2b8f0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2b900 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
2b910 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43  oNotSpill NOSYNC
2b920 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69   bit is set duri
2b930 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f  ng times when do
2b940 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20  ing a sync of.  
2b950 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  ** journal (and 
2b960 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61  adding a new hea
2b970 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  der) is not allo
2b980 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72  wed.  This occur
2b990 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61  s.  ** during ca
2b9a0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2b9b0 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65  gerWrite() while
2b9c0 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e   trying to journ
2b9d0 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a  al multiple.  **
2b9e0 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67   pages belonging
2b9f0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63   to the same sec
2ba00 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tor..  **.  ** T
2ba10 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f  he doNotSpill RO
2ba20 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62  LLBACK and OFF b
2ba30 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  its inhibits all
2ba40 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a   cache spilling.
2ba50 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20    ** regardless 
2ba60 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
2ba70 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
2ba80 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
2ba90 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61  et during.  ** a
2baa0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20   rollback or by 
2bab0 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65  user request, re
2bac0 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a  spectively..  **
2bad0 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69  .  ** Spilling i
2bae0 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65  s also prohibite
2baf0 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72  d when in an err
2bb00 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74  or state since t
2bb10 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c  hat could.  ** l
2bb20 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
2bb30 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e  corruption.   In
2bb40 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
2bb50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a  lementation it .
2bb60 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62    ** is impossib
2bb70 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63  le for sqlite3Pc
2bb80 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62  acheFetch() to b
2bb90 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72  e called with cr
2bba0 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a  eateFlag==3.  **
2bbb0 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72   while in the er
2bbc0 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65  ror state, hence
2bbd0 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   it is impossibl
2bbe0 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
2bbf0 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61  ne to.  ** be ca
2bc00 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f  lled in the erro
2bc10 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74  r state.  Nevert
2bc20 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75  heless, we inclu
2bc30 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a  de a NEVER().  *
2bc40 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65  * test for the e
2bc50 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20  rror state as a 
2bc60 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73  safeguard agains
2bc70 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73  t future changes
2bc80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2bc90 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2bca0 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  de) ) return SQL
2bcb0 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61  ITE_OK;.  testca
2bcc0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2bcd0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2bce0 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  AG_ROLLBACK );. 
2bcf0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2bd00 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2bd10 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b  SPILLFLAG_OFF );
2bd20 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2bd30 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2bd40 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59  & SPILLFLAG_NOSY
2bd50 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  NC );.  if( pPag
2bd60 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20  er->doNotSpill. 
2bd70 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64    && ((pPager->d
2bd80 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49  oNotSpill & (SPI
2bd90 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c  LLFLAG_ROLLBACK|
2bda0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21  SPILLFLAG_OFF))!
2bdb0 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  =0.      || (pPg
2bdc0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
2bdd0 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20  NEED_SYNC)!=0). 
2bde0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2bdf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2be00 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
2be10 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
2be20 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 23  Wal(pPager) ){.#
2be30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2be40 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20  IT_CONCURRENT.  
2be50 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 61 6e    /* If the tran
2be60 73 61 63 74 69 6f 6e 20 69 73 20 61 20 22 42 45  saction is a "BE
2be70 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 22 20  GIN CONCURRENT" 
2be80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2be90 20 70 61 67 65 20 0a 20 20 20 20 2a 2a 20 63 61   page .    ** ca
2bea0 6e 6e 6f 74 20 62 65 20 66 6c 75 73 68 65 64 20  nnot be flushed 
2beb0 74 6f 20 64 69 73 6b 2e 20 52 65 74 75 72 6e 20  to disk. Return 
2bec0 65 61 72 6c 79 20 69 6e 20 74 68 69 73 20 63 61  early in this ca
2bed0 73 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  se. */.    if( p
2bee0 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20  Pager->pAllRead 
2bef0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2bf00 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  OK;.#endif..    
2bf10 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c  /* Write a singl
2bf20 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73  e frame for this
2bf30 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67   page to the log
2bf40 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 75  . */.    rc = su
2bf50 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
2bf60 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20 20  quired(pPg); .  
2bf70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bf80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2bf90 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
2bfa0 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c  (pPager, pPg, 0,
2bfb0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2bfc0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
2bfd0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2bfe0 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
2bff0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
2c000 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2c010 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20  D_SYNC .     || 
2c020 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2c030 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
2c040 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20  HEMOD.    ){.   
2c050 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2c060 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  nal(pPager, 1);.
2c070 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2c080 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
2c090 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
2c0a0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2c0b0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2c0c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c0d0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2c0e0 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
2c0f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2c100 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
2c110 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2c120 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50  elist(pPager, pP
2c130 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
2c140 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2c150 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
2c160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c170 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
2c180 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
2c190 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2c1a0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2c1b0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
2c1c0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2c1d0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
2c1e0 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2c1f0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2c200 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  ); .}../*.** Flu
2c210 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e  sh all unreferen
2c220 63 65 64 20 64 69 72 74 79 20 70 61 67 65 73 20  ced dirty pages 
2c230 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
2c240 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73  sqlite3PagerFlus
2c250 68 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  h(Pager *pPager)
2c260 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61  {.  int rc = pPa
2c270 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2c280 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
2c290 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d    PgHdr *pList =
2c2a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2c2b0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2c2c0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73  pPCache);.    as
2c2d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2c2e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2c2f0 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72   );.    while( r
2c300 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2c310 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50  pList ){.      P
2c320 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
2c330 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
2c340 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52     if( pList->nR
2c350 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
2c360 20 72 63 20 3d 20 70 61 67 65 72 53 74 72 65 73   rc = pagerStres
2c370 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c  s((void*)pPager,
2c380 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
2c390 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70  .      pList = p
2c3a0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
2c3b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c3c0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2c3d0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2c3e0 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
2c3f0 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
2c400 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
2c410 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
2c420 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
2c430 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
2c440 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
2c450 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
2c460 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
2c470 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
2c480 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
2c490 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2c4a0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
2c4b0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
2c4c0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
2c4d0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
2c4e0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
2c4f0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
2c500 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
2c510 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
2c520 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
2c530 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
2c540 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
2c550 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
2c560 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
2c570 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
2c580 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
2c590 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
2c5a0 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
2c5b0 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
2c5c0 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
2c5d0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
2c5e0 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
2c5f0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
2c600 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
2c610 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
2c620 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
2c630 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2c640 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
2c650 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
2c660 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
2c670 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
2c680 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2c690 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
2c6a0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2c6b0 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
2c6c0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2c6d0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2c6e0 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2c6f0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2c700 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2c710 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2c720 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2c730 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2c740 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2c750 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2c760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2c770 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2c780 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2c790 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2c7a0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2c7b0 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2c7c0 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2c7d0 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2c7e0 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2c7f0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2c800 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2c810 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2c820 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2c830 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2c840 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2c850 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2c860 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2c870 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2c880 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2c890 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2c8a0 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2c8b0 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2c8c0 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2c8d0 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2c8e0 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2c8f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2c900 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2c910 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2c920 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2c930 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2c940 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2c950 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2c960 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2c970 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2c980 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c990 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2c9a0 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2c9b0 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2c9c0 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2c9d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2c9e0 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2c9f0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2ca00 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2ca10 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2ca20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2ca30 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2ca40 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2ca50 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2ca60 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2ca70 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2ca80 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2ca90 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2caa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2cab0 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2cac0 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2cad0 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2cae0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2caf0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2cb00 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2cb10 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2cb20 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2cb30 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2cb40 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2cb50 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2cb60 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2cb70 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2cb80 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2cb90 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2cba0 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2cbb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2cbc0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2cbd0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2cbe0 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2cbf0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2cc00 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2cc10 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2cc20 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2cc30 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2cc40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2cc50 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2cc60 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2cc70 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2cc80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2cc90 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2cca0 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2ccb0 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2ccc0 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2ccd0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2cce0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2ccf0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2cd00 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2cd10 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2cd20 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2cd30 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2cd40 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2cd50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2cd60 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2cd70 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2cd80 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2cd90 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2cda0 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2cdb0 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2cdc0 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2cdd0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2cde0 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2cdf0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2ce00 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2ce10 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2ce20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2ce30 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2ce40 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2ce50 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2ce60 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2ce70 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2ce80 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2ce90 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2cea0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2ceb0 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2cec0 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2ced0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2cee0 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2cef0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2cf00 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2cf10 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2cf20 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2cf30 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2cf40 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2cf50 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
2cf60 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
2cf70 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
2cf80 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
2cf90 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
2cfa0 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
2cfb0 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
2cfc0 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
2cfd0 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
2cfe0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
2cff0 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
2d000 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
2d010 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
2d020 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
2d030 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
2d040 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
2d050 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
2d060 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2d070 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
2d080 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
2d090 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
2d0a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
2d0b0 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2d0c0 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
2d0d0 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
2d0e0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2d0f0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2d100 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2d110 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
2d120 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2d130 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2d140 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2d150 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
2d160 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
2d170 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2d180 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2d190 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2d1a0 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2d1b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d1c0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2d1d0 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2d1e0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2d1f0 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mDb = 1;.    if(
2d200 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d210 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d220 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2d230 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2d240 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  0, zFilename);. 
2d250 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61       if( zPathna
2d260 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20  me==0  ) return 
2d270 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2d280 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2d290 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2d2a0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2d2b0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2d2c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2d2d0 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2d2e0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2d2f0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2d300 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2d310 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2d320 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2d330 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2d340 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2d350 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2d360 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2d370 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2d380 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2d390 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2d3a0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d3b0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d3c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2d3d0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2d3e0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2d3f0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2d400 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2d410 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2d420 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2d430 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2d440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d450 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2d460 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b  }.    zPathname[
2d470 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
2d480 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
2d490 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
2d4a0 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
2d4b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d4c0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
2d4d0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
2d4e0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
2d4f0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74  hname);.    nPat
2d500 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2d510 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2d520 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69  e);.    z = zUri
2d530 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71   = &zFilename[sq
2d540 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
2d550 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20  ilename)+1];.   
2d560 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
2d570 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2d580 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2d590 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2d5a0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2d5b0 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d      }.    nUri =
2d5c0 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a   (int)(&z[1] - z
2d5d0 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Uri);.    assert
2d5e0 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20  ( nUri>=0 );.   
2d5f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d600 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
2d610 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
2d620 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
2d630 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2d640 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
2d650 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
2d660 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
2d670 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
2d680 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
2d690 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
2d6a0 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
2d6b0 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
2d6c0 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
2d6d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
2d6e0 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
2d6f0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
2d700 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
2d710 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
2d720 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
2d730 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
2d740 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
2d750 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
2d760 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
2d770 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d780 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
2d790 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2d7a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d7b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2d7c0 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2d7d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2d7e0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
2d7f0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
2d800 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
2d810 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
2d820 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
2d830 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
2d840 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
2d850 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
2d860 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
2d870 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
2d880 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
2d890 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
2d8a0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
2d8b0 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
2d8c0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2d8d0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
2d8e0 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
2d8f0 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
2d900 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
2d910 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
2d920 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
2d930 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
2d940 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
2d950 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
2d960 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
2d970 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
2d980 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2d990 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
2d9a0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2d9b0 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
2d9c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2d9d0 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
2d9e0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2d9f0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2da00 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
2da10 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2da20 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
2da30 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
2da40 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2da50 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2da60 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
2da70 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
2da80 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2da90 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
2daa0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2dab0 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
2dac0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
2dad0 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
2dae0 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
2daf0 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
2db00 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
2db10 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2db20 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
2db30 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
2db40 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2db50 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
2db60 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
2db70 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
2db80 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2db90 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20  1 + nUri +      
2dba0 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2dbb0 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
2dbc0 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20   + 8 + 2        
2dbd0 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
2dbe0 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
2dbf0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2dc00 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
2dc10 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2dc20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
2dc30 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
2dc40 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2dc50 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
2dc60 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
2dc70 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
2dc80 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
2dc90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2dca0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2dcb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2dcc0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
2dcd0 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2dce0 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2dcf0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2dd00 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2dd10 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2dd20 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2dd30 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2dd40 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2dd50 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2dd60 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2dd70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2dd80 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2dd90 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2dda0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2ddb0 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2ddc0 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2ddd0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2dde0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2ddf0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2de00 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2de10 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2de20 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2de30 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2de40 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2de50 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2de60 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2de70 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2de80 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2de90 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2dea0 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2deb0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2dec0 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2ded0 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2dee0 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2def0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2df00 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2df10 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2df20 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2df30 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2df40 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2df50 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2df60 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2df70 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2df80 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2df90 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2dfa0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2dfb0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2dfc0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2dfd0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2dfe0 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2dff0 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2e000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2e010 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2e020 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2e030 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2e040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e050 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2e060 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2e070 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2e080 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2e090 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2e0a0 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2e0b0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2e0c0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2e0d0 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2e0e0 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2e0f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2e100 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2e110 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2e120 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2e130 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2e140 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2e150 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2e160 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2e170 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2e180 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2e190 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2e1a0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2e1b0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2e1c0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2e1d0 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2e1e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e1f0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2e200 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2e210 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2e220 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2e230 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2e240 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2e250 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2e260 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2e270 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2e280 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2e290 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2e2a0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2e2b0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2e2c0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2e2d0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2e2e0 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2e2f0 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2e300 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2e310 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2e320 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2e330 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2e340 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2e350 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2e360 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2e370 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2e380 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2e390 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2e3a0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2e3b0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2e3c0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2e3d0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2e3e0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2e3f0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2e400 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2e410 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2e420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e430 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
2e440 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2e450 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2e460 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2e470 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e       if( !readOn
2e480 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
2e490 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2e4a0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
2e4b0 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2e4c0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2e4d0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e4e0 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2e4f0 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2e500 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2e510 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2e520 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e530 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2e540 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e550 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2e560 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e570 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2e580 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2e5a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2e5b0 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2e5c0 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2e5d0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
2e5e0 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
2e5f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2e600 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2e610 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2e620 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2e630 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e640 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2e650 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2e660 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2e670 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2e680 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2e690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2e6a0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2e6b0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e6c0 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2e6d0 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2e6e0 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2e6f0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e700 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2e710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e720 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2e730 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2e740 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2e750 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2e760 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2e770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e780 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2e790 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
2e7a0 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e7b0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2e7c0 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2e7d0 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20  "nolock", 0);.  
2e7e0 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53      if( (iDc & S
2e7f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55  QLITE_IOCAP_IMMU
2e800 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20  TABLE)!=0.      
2e810 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   || sqlite3_uri_
2e820 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2e830 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20  e, "immutable", 
2e840 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2e850 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  vfsFlags |= SQLI
2e860 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e870 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2e880 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66   act_like_temp_f
2e890 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
2e8a0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2e8b0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2e8c0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2e8d0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2e8e0 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2e8f0 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2e900 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2e910 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2e920 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2e930 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2e940 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2e950 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2e960 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2e970 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2e980 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2e990 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2e9a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2e9b0 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2e9c0 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2e9d0 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2e9e0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2e9f0 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2ea00 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2ea10 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2ea20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2ea30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2ea40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2ea50 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75  s branch also ru
2ea60 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72  ns for files mar
2ea70 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ked as immutable
2ea80 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69  ..    */ .act_li
2ea90 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20  ke_temp_file:.  
2eaa0 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2eab0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2eac0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2ead0 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  R;     /* Preten
2eae0 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  d we already hav
2eaf0 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  e a lock */.    
2eb00 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2eb10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20  EXCLUSIVE_LOCK; 
2eb20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2eb30 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56   are in EXCLUSIV
2eb40 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50  E mode */.    pP
2eb50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31  ager->noLock = 1
2eb60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eb70 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e   /* Do no lockin
2eb80 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c  g */.    readOnl
2eb90 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2eba0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2ebb0 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2ebc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2ebd0 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2ebe0 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2ebf0 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2ec00 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2ec10 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2ec20 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2ec30 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2ec40 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2ec50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ec60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ec70 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2ec80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ec90 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2eca0 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2ecb0 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2ecc0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2ecd0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2ece0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2ecf0 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2ed00 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2ed10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ed20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
2ed30 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72  000 );.    nExtr
2ed40 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
2ed50 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  a);.    rc = sql
2ed60 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2ed70 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2ed80 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eda0 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2edb0 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2edc0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2edd0 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
2ede0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2edf0 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20  occurred above, 
2ee00 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20  free the  Pager 
2ee10 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
2ee20 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
2ee30 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
2ee40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2ee50 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2ee60 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
2ee70 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
2ee80 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
2ee90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2eea0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2eeb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2eec0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
2eed0 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
2eee0 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
2eef0 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
2ef00 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
2ef10 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
2ef20 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
2ef30 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2ef40 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
2ef50 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
2ef60 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a  useJournal;.  /*
2ef70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
2ef80 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
2ef90 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
2efa0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2efb0 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
2efc0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2efd0 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
2efe0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2eff0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
2f000 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
2f010 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
2f020 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
2f030 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
2f040 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
2f050 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2f060 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
2f070 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2f080 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2f090 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
2f0a0 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
2f0b0 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
2f0c0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2f0d0 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
2f0e0 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
2f0f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2f100 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2f110 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2f120 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2f130 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
2f140 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2f150 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
2f160 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
2f170 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2f180 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2f190 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
2f1a0 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
2f1b0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2f1c0 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
2f1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
2f1e0 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
2f1f0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2f200 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
2f210 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2f220 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
2f230 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
2f240 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
2f250 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  ullSync==0 );.  
2f260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f270 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29  ->extraSync==0 )
2f280 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f290 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
2f2a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2f2b0 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  ( pPager->walSyn
2f2c0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2f2d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f2e0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d  >ckptSyncFlags==
2f2f0 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
2f300 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2f310 6e 63 20 3d 20 31 3b 0a 23 69 66 20 53 51 4c 49  nc = 1;.#if SQLI
2f320 54 45 5f 45 58 54 52 41 5f 44 55 52 41 42 4c 45  TE_EXTRA_DURABLE
2f330 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74  .    pPager->ext
2f340 72 61 53 79 6e 63 20 3d 20 31 3b 0a 23 65 6c 73  raSync = 1;.#els
2f350 65 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  e.    pPager->ex
2f360 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 23 65 6e  traSync = 0;.#en
2f370 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
2f380 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
2f390 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2f3a0 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
2f3b0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2f3c0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
2f3d0 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
2f3e0 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65  TIONS;.    pPage
2f3f0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2f400 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2f410 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
2f420 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2f430 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f440 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2f450 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f460 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2f470 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2f480 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2f490 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2f4a0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2f4b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2f4c0 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2f4d0 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2f4e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f4f0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2f500 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2f510 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2f520 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2f530 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2f540 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2f550 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2f560 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2f570 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2f580 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2f590 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2f5a0 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2f5b0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2f5c0 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2f5d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2f5e0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2f5f0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2f600 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2f610 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
2f620 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
2f630 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
2f640 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
2f650 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
2f660 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2f670 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
2f680 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
2f690 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
2f6a0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2f6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f6c0 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
2f6d0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2f6e0 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
2f6f0 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
2f700 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  med out from.** 
2f710 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e  under the pager.
2f720 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2f730 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61  OK if the databa
2f740 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65  se is still were
2f750 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20   it ought.** to 
2f760 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74  be on disk.  Ret
2f770 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51  urn non-zero (SQ
2f780 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2f790 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74  MOVED or some ot
2f7a0 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  her error.** cod
2f7b0 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73  e from sqlite3Os
2f7c0 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65  Access()) if the
2f7d0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f   database has go
2f7e0 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73  ne missing..*/.s
2f7f0 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61  tatic int databa
2f800 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65  seIsUnmoved(Page
2f810 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2f820 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b  t bHasMoved = 0;
2f830 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2f840 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
2f850 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
2f860 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
2f870 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29  ger->dbSize==0 )
2f880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f890 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
2f8a0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26  ger->zFilename &
2f8b0 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  & pPager->zFilen
2f8c0 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d  ame[0] );.  rc =
2f8d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
2f8e0 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
2f8f0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48  , SQLITE_FCNTL_H
2f900 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d  AS_MOVED, &bHasM
2f910 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  oved);.  if( rc=
2f920 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
2f930 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2f940 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65  e HAS_MOVED file
2f950 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d  -control is unim
2f960 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d  plemented, assum
2f970 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a  e that the file.
2f980 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
2f990 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74  een moved.  That
2f9a0 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63   is the historic
2f9b0 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53  al behavior of S
2f9c0 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a  QLite: prior to.
2f9d0 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
2f9e0 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63  .8.3, it never c
2f9f0 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63  hecked */.    rc
2fa00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2fa10 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2fa20 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d  LITE_OK && bHasM
2fa30 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  oved ){.    rc =
2fa40 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2fa50 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20  _DBMOVED;.  }.  
2fa60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2fa70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2fa80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2fa90 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2faa0 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2fab0 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2fac0 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2fad0 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2fae0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2faf0 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2fb00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2fb10 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2fb20 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2fb30 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2fb40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2fb50 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2fb60 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2fb70 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2fb80 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2fb90 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2fba0 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2fbb0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2fbc0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2fbd0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2fbe0 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2fbf0 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2fc00 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2fc10 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2fc20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2fc30 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2fc40 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2fc50 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2fc60 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2fc70 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2fc80 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2fc90 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2fca0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2fcb0 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2fcc0 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2fcd0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2fce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2fcf0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2fd00 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2fd10 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2fd20 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2fd30 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2fd40 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2fd50 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2fd60 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2fd70 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2fd80 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2fd90 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2fda0 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2fdb0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2fdc0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2fdd0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2fde0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2fdf0 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2fe00 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2fe10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2fe20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2fe30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2fe40 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2fe50 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2fe60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2fe70 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2fe80 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2fe90 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2fea0 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2feb0 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2fec0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2fed0 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2fee0 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2fef0 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2ff00 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2ff10 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2ff20 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2ff30 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2ff40 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2ff50 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2ff60 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2ff70 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2ff80 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2ff90 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2ffa0 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2ffb0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2ffc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2ffd0 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2ffe0 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2fff0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
30000 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
30010 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
30020 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
30030 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
30040 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
30050 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
30060 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
30070 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
30080 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
30090 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
300a0 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
300b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
300c0 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
300d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
300e0 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
300f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
30100 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
30110 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
30120 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30130 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30140 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
30150 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
30160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30170 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
30180 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
30190 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
301a0 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
301b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
301c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
301d0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
301e0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
301f0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
30200 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
30210 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
30220 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
30230 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
30240 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
30250 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
30260 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
30270 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
30280 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
30290 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
302a0 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
302b0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
302c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
302d0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
302e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
302f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
30300 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
30310 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
30320 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
30330 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
30340 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
30350 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30360 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
30370 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
30380 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
30390 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
303a0 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
303b0 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
303c0 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
303d0 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
303e0 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
303f0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
30400 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
30410 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
30420 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
30430 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
30440 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
30450 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
30460 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
30470 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
30480 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
30490 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
304a0 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
304b0 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
304c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
304d0 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
304e0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
304f0 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
30500 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
30510 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
30520 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
30530 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
30540 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
30550 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
30560 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
30570 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
30580 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
30590 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
305a0 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
305b0 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
305c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
305d0 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
305e0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
305f0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
30600 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30610 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
30620 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
30630 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
30640 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
30650 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
30660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30670 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
30680 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
30690 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20  s zero pages in 
306a0 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  size, that means
306b0 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29   that either (1)
306c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
306d0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d  journal is a rem
306e0 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f  nant from a prio
306f0 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  r database with 
30700 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68  the same name wh
30710 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ere.        ** t
30720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30730 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75   but not the jou
30740 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64  rnal was deleted
30750 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69  , or (2) the ini
30760 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  tial.        ** 
30770 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
30780 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77   populates a new
30790 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69   database is bei
307a0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ng rolled back..
307b0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69          ** In ei
307c0 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a  ther case, the j
307d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20  ournal file can 
307e0 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77  be deleted.  How
307f0 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a  ever, take care.
30800 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74          ** not t
30810 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
30820 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
30830 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
30840 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  due to.        *
30850 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  * journal_mode=P
30860 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20  ERSIST..        
30870 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  */.        if( n
30880 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c  Page==0 && !jrnl
30890 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
308a0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
308b0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
308c0 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
308d0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
308e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
308f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30900 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30910 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
30920 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
30930 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
30940 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
30950 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
30960 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
30970 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
30980 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
309a0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
309b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
309c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
309d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
309e0 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
309f0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
30a00 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
30a10 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
30a20 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
30a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
30a40 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
30a50 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
30a60 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
30a70 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
30a80 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
30a90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30aa0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
30ab0 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
30ac0 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
30ad0 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
30ae0 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
30af0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
30b00 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
30b10 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
30b20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
30b30 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
30b40 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
30b50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
30b60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30b70 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
30b80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30b90 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
30ba0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
30bb0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
30bc0 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
30bd0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
30be0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
30c00 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
30c10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30c20 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
30c30 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
30c40 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
30c50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30c60 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
30c70 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
30c80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
30ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30cb0 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
30cc0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
30cd0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
30ce0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
30cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30d00 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
30d10 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
30d20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
30d30 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
30d40 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
30d50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
30d60 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
30d70 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
30d80 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
30d90 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
30da0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
30db0 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
30dc0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
30dd0 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
30de0 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
30df0 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
30e00 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
30e10 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
30e20 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
30e30 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
30e40 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
30e50 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
30e60 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
30e70 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
30e80 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
30e90 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
30ea0 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
30eb0 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
30ec0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
30ed0 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
30ee0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
30ef0 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
30f00 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
30f10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
30f20 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
30f30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
30f40 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
30f50 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
30f60 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
30f70 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
30f80 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
30f90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30fa0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
30fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30fc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30fe0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30ff0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
31000 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
31010 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
31020 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
31030 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
31040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31050 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
31060 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
31070 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74  e3PagerGet() unt
31080 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
31090 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
310a0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
310b0 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
310c0 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
310d0 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
310e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
310f0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
31100 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
31110 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
31120 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
31130 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
31140 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
31150 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
31160 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
31170 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  y in PAGER_OPEN 
31180 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
31190 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
311a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
311b0 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
311c0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
311d0 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
311e0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
311f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31200 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
31210 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
31220 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
31230 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
31240 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
31250 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
31260 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
31270 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
31280 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
31290 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
312a0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
312b0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
312c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
312d0 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
312e0 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
312f0 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
31300 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
31310 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
31320 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
31330 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
31340 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
31350 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
31360 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
31370 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
31380 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
31390 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
313a0 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
313b0 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
313c0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
313d0 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
313e0 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
313f0 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
31400 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
31410 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
31420 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
31430 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
31440 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
31450 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31460 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
31470 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
31480 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
31490 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
314a0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
314b0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
314c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
314d0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
314e0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
314f0 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
31500 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
31510 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
31520 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a  urnal file or .*
31530 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  * rolling back a
31540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
31550 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
31560 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
31570 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31580 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
31590 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
315a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
315b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
315c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
315d0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
315e0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
315f0 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
31600 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
31610 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
31620 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
31630 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73  es. This implies
31640 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
31650 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74  state should eit
31660 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e  her.  ** be OPEN
31670 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44   or READER. READ
31680 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ER is only possi
31690 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72  ble if the pager
316a0 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20   is or was in . 
316b0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
316c0 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a  cess mode..  */.
316d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
316e0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
316f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
31700 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
31710 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
31720 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
31730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31740 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31750 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
31760 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
31770 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  DER );.  if( NEV
31780 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ER(MEMDB && pPag
31790 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20  er->errCode) ){ 
317a0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
317b0 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28  rrCode; }..  if(
317c0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
317d0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
317e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
317f0 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
31800 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
31810 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31820 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
31830 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
31840 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
31850 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20  rt( !MEMDB );.. 
31860 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
31870 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
31880 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
31890 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
318a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
318b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
318c0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
318d0 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
318e0 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
318f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
31900 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
31910 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
31920 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
31930 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
31940 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
31950 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
31960 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
31970 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
31980 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
31990 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
319a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
319b0 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  >eLock<=SHARED_L
319c0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
319d0 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
319e0 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75  pPager, &bHotJou
319f0 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rnal);.    }.   
31a00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31a10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
31a20 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
31a30 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e     if( bHotJourn
31a40 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
31a50 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
31a60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
31a70 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
31a80 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
31a90 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31aa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
31ab0 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
31ac0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
31ad0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
31ae0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
31af0 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
31b00 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
31b10 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
31b20 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
31b30 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
31b40 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
31b50 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
31b60 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
31b70 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
31b80 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
31b90 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
31ba0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
31bb0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
31bc0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
31bd0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
31be0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
31bf0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
31c00 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
31c10 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
31c20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
31c30 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
31c40 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
31c50 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
31c60 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
31c70 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
31c80 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
31c90 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
31ca0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
31cb0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
31cc0 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
31cd0 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
31ce0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
31cf0 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
31d00 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
31d10 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
31d20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31d30 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
31d40 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    ** Unless the 
31d50 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b  pager is in lock
31d60 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
31d70 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ve mode, the loc
31d80 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  k is.      ** do
31d90 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52  wngraded to SHAR
31da0 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74  ED_LOCK before t
31db0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
31dc0 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  urns..      */. 
31dd0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
31de0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
31df0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
31e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31e20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
31e30 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
31e40 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  * If it is not a
31e50 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20  lready open and 
31e60 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20  the file exists 
31e70 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68  on disk, open th
31e80 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
31e90 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
31ea0 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65  te access. Write
31eb0 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69   access is requi
31ec0 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20  red because .   
31ed0 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69     ** in exclusi
31ee0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
31ef0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
31f00 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
31f10 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  open .      ** a
31f20 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  nd possibly used
31f30 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
31f40 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73  on later on. Als
31f50 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20  o, write-access 
31f60 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75  .      ** is usu
31f70 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f  ally required to
31f80 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
31f90 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c  urnal in journal
31fa0 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20  _mode=persist . 
31fb0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e       ** mode (an
31fc0 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e  d also for journ
31fd0 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65  al_mode=truncate
31fe0 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
31ff0 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )..      **.    
32000 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    ** If the jour
32010 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
32020 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
32030 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
32040 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
32050 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
32060 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
32070 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
32080 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
32090 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
320a0 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
320b0 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
320c0 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a   Or, it .      *
320d0 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20  * may mean that 
320e0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
320f0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
32100 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20   when this.     
32110 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73   ** function was
32120 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20   called and the 
32130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
32140 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
32150 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
32160 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
32170 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
32180 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
32190 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
321a0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20  r->pVfs;.       
321b0 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20   int bExists;   
321c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
321d0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
321e0 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
321f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32200 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
32210 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
32220 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
32230 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
32240 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a  STS, &bExists);.
32250 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
32260 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78  SQLITE_OK && bEx
32270 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ists ){.        
32280 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
32290 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
322a0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
322b0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
322c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
322d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
322e0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
322f0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
32300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
32310 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
32320 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
32330 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
32340 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
32350 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
32360 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
32370 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
32380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
323a0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
323b0 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
323c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
323d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
323e0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  T;.            s
323f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
32400 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
32410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32420 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  }.      }. .    
32430 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
32440 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
32450 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
32460 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
32470 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
32480 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
32490 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
324a0 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
324b0 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
324c0 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
324d0 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
324e0 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
324f0 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
32500 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
32510 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f  he.  Sync the ho
32520 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t journal before
32530 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a   playing.      *
32540 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20  * it back since 
32550 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
32560 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66   crashed and lef
32570 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  t the hot journa
32580 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61  l.      ** proba
32590 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63  bly did not sync
325a0 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72   it and we are r
325b0 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79  equired to alway
325c0 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20  s sync.      ** 
325d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
325e0 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  re playing it ba
325f0 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
32600 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
32610 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
32620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
32630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
32640 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
32650 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
32660 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
32670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32680 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32690 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
326a0 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
326b0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
326c0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
326d0 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d  _OPEN;.        }
326e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
326f0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
32700 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
32710 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62     pagerUnlockDb
32720 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
32730 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LOCK);.      }..
32740 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32760 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
32770 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e  h is taken if an
32780 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32790 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70  ile trying to op
327a0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  en.        ** or
327b0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74   roll back a hot
327c0 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68  -journal while h
327d0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
327e0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
327f0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75        ** pager_u
32800 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  nlock() routine 
32810 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62  will be called b
32820 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
32830 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  to unlock.      
32840 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49    ** the file. I
32850 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74  f the unlock att
32860 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  empt fails, then
32870 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73   Pager.eLock mus
32880 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
32890 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
328a0 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d  OCK (see the com
328b0 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
328c0 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20  define for .    
328d0 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c      ** UNKNOWN_L
328e0 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e  OCK above for an
328f0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a   explanation). .
32900 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
32910 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74     ** In order t
32920 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f  o get pager_unlo
32930 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c  ck() to do this,
32940 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74   set Pager.eStat
32950 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
32960 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e  PAGER_ERROR now.
32970 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
32980 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73  ually counted as
32990 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20   a transition.  
329a0 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f        ** to ERRO
329b0 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73  R state in the s
329c0 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20  tate diagram at 
329d0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
329e0 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  file,.        **
329f0 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
32a00 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c  hat the same cal
32a10 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
32a20 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20  k() will very.  
32a30 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79        ** shortly
32a40 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20   transition the 
32a50 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  pager object to 
32a60 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
32a70 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20  Calling.        
32a80 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ** assert_pager_
32a90 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61  state() would fa
32aa0 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68  il now, as it sh
32ab0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73  ould not be poss
32ac0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ible.        ** 
32ad0 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73  to be in ERROR s
32ae0 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20  tate when there 
32af0 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e  are zero outstan
32b00 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20  ding page .     
32b10 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
32b20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32b30 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
32b40 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
32b50 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32b60 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
32b70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32b80 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32b90 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73  OPEN );.      as
32ba0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
32bb0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
32bc0 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  K).           ||
32bd0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
32be0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
32bf0 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  r->eLock>SHARED_
32c00 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20  LOCK).      );. 
32c10 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
32c20 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32c30 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  && pPager->hasHe
32c40 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a  ldSharedLock ){.
32c50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
32c60 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
32c70 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
32c80 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20  then check to.  
32c90 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68      ** see if th
32ca0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
32cb0 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
32cc0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
32cd0 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20  as changed,.    
32ce0 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63    ** flush the c
32cf0 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48 65  ache.  The hasHe
32d00 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61  ldSharedLock fla
32d10 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20  g prevents this 
32d20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63  from.      ** oc
32d30 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76  curring on the v
32d40 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73  ery first access
32d50 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f   to a file, in o
32d60 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20  rder to save a. 
32d70 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75       ** single u
32d80 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74  nnecessary sqlit
32d90 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20  e3OsRead() call 
32da0 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e  at the start-up.
32db0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
32dc0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
32dd0 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ges are detected
32de0 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
32df0 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
32e00 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
32e10 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
32e20 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
32e30 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
32e40 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
32e50 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
32e60 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
32e70 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
32e80 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
32e90 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
32ea0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
32eb0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
32ec0 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
32ed0 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
32ee0 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
32ef0 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
32f00 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
32f10 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
32f20 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
32f30 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
32f40 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
32f50 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
32f60 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
32f70 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
32f80 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
32f90 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
32fa0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
32fb0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
32fc0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
32fd0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
32fe0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
32ff0 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  s)];..      rc =
33000 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
33010 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
33020 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
33030 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20  goto failed;..  
33040 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20      if( nPage>0 
33050 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
33060 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
33070 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
33080 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
33090 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
330a0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
330b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
330c0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
330d0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
330e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
330f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
33100 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
33110 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
33120 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
33130 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
33140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33150 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
33160 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
33170 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
33180 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33190 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
331a0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
331b0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
331c0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
331d0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
331e0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  reset(pPager);..
331f0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70          /* Unmap
33200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33210 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62  le. It is possib
33220 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c  le that external
33230 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20   processes.     
33240 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74     ** may have t
33250 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74  runcated the dat
33260 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
33270 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20  hen extended it 
33280 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  back.        ** 
33290 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
332a0 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20  size while this 
332b0 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20  process was not 
332c0 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a  holding a lock..
332d0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
332e0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61  is case there ma
332f0 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e  y exist a Pager.
33300 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61  pMap mapping tha
33310 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20  t appears.      
33320 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72    ** to be the r
33330 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73  ight size but is
33340 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61   not actually va
33350 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a  lid. Avoid this.
33360 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
33370 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70  bility by unmapp
33380 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e  ing the db here.
33390 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
333a0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
333b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
333c0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
333d0 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
333e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
333f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
33400 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
33410 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
33420 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
33430 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
33440 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
33450 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
33460 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
33470 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
33480 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
33490 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
334a0 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
334b0 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
334c0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
334d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
334e0 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
334f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
33500 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
33510 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33520 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
33530 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
33540 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
33550 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
33560 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
33570 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
33580 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33590 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
335a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
335b0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
335c0 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
335d0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
335e0 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
335f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33600 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
33610 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
33620 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
33630 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
33640 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33650 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
33660 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
33670 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
33680 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
33690 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
336a0 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Lock = 1;.  }.  
336b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
336c0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
336d0 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
336e0 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
336f0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
33700 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
33710 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
33720 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
33730 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
33740 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
33750 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
33760 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
33770 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
33780 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
33790 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
337a0 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
337b0 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
337c0 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
337d0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
337e0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
337f0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
33800 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
33810 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
33820 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26  ->nMmapOut==0 &&
33830 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
33840 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
33850 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a  pPCache)==0) ){.
33860 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
33870 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
33880 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
33890 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
338a0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
338b0 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
338c0 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
338d0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
338e0 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
338f0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
33900 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
33910 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
33920 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
33930 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
33940 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
33950 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
33960 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
33970 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
33980 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
33990 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
339a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
339b0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
339c0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
339d0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
339e0 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
339f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
33a00 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
33a10 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
33a20 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
33a30 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
33a40 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
33a50 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
33a60 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
33a70 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
33a80 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
33a90 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
33aa0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
33ab0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
33ac0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
33ad0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
33ae0 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
33af0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
33b00 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
33b10 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
33b20 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
33b30 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
33b40 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
33b50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
33b60 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
33b70 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
33b80 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
33b90 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
33ba0 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
33bb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
33bc0 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
33bd0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
33be0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
33bf0 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
33c00 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
33c10 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
33c20 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
33c30 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
33c40 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
33c50 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
33c60 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
33c70 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
33c80 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
33c90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
33ca0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
33cb0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
33cc0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
33cd0 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
33ce0 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
33cf0 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
33d00 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
33d10 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
33d20 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
33d30 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
33d40 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65  ccurs in two sce
33d50 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
33d60 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
33d70 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
33d80 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
33d90 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
33da0 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
33db0 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
33dc0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
33dd0 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
33de0 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
33df0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
33e00 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
33e10 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
33e20 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
33e30 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
33e40 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
33e50 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
33e60 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
33e70 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
33e80 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  roed instead of.
33e90 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  ** being read fr
33ea0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
33eb0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
33ec0 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
33ed0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
33ee0 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
33ef0 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
33f00 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
33f10 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
33f20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
33f30 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
33f40 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
33f50 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
33f60 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
33f70 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
33f80 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
33f90 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
33fa0 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
33fb0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
33fc0 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
33fd0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
33fe0 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
33ff0 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
34000 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
34010 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
34020 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
34030 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
34040 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
34050 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
34060 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
34070 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
34080 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
34090 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
340a0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
340b0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
340c0 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
340d0 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
340e0 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
340f0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
34100 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
34110 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
34120 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
34130 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
34140 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
34150 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
34160 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
34170 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
34180 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
34190 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
341a0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
341b0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
341c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
341d0 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
341e0 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
341f0 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
34200 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
34210 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
34220 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
34230 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
34240 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
34250 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
34260 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
34270 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
34280 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20  lite3PagerGet(. 
34290 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
342a0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
342b0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
342c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
342d0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
342e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
342f0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
34300 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
34310 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
34320 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
34330 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
34340 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
34350 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
34360 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
34370 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34380 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
34390 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
343a0 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
343b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
343c0 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
343d0 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  WAL file */.  co
343e0 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  nst int noConten
343f0 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
34400 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34410 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  );..  /* It is a
34420 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
34430 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
34440 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
34450 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
34460 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
34470 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
34480 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
34490 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
344a0 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
344b0 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
344c0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
344d0 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
344e0 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
344f0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
34500 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
34510 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
34520 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
34530 67 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43  gno>1 && USEFETC
34540 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20  H(pPager).   && 
34550 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
34560 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  =PAGER_READER ||
34570 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
34580 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23  GET_READONLY)).#
34590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
345a0 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61  _CODEC.   && pPa
345b0 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23  ger->xCodec==0.#
345c0 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a  endif.  );..  /*
345d0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
345e0 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
345f0 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
34600 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
34610 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
34620 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
34630 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
34640 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
34650 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
34660 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
34670 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
34680 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
34690 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
346a0 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
346b0 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
346c0 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
346d0 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
346e0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
346f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34700 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
34710 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
34720 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
34730 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
34740 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
34750 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
34760 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e  assert( noConten
34770 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d  t==0 || bMmapOk=
34780 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  =0 );..  assert(
34790 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
347a0 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b  SharedLock==1 );
347b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
347c0 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
347d0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
347e0 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   an CONCURRENT t
347f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
34800 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 72 65  he page being re
34810 61 64 20 77 61 73 0a 20 20 2a 2a 20 70 72 65 73  ad was.  ** pres
34820 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
34830 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
34840 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
34850 73 20 6f 70 65 6e 65 64 2c 0a 20 20 2a 2a 20 6d  s opened,.  ** m
34860 61 72 6b 20 69 74 20 61 73 20 72 65 61 64 20 69  ark it as read i
34870 6e 20 74 68 65 20 70 41 6c 6c 52 65 61 64 20 76  n the pAllRead v
34880 65 63 74 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28  ector.  */.  if(
34890 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
348a0 64 20 26 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65  d && pgno<=pPage
348b0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
348c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
348d0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
348e0 72 2d 3e 70 41 6c 6c 52 65 61 64 2c 20 70 67 6e  r->pAllRead, pgn
348f0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
34900 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34910 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34920 72 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rr;.  }.#endif..
34930 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
34940 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
34950 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
34960 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
34970 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
34980 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
34990 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
349a0 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
349b0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
349c0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
349d0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
349e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
349f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
34a00 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65   bMmapOk && page
34a10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
34a20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
34a30 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
34a40 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
34a50 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
34a60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34a70 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34a80 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34a90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
34aa0 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
34ab0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  me==0 ){.      v
34ac0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
34ad0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34ae0 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65  te3OsFetch(pPage
34af0 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20  r->fd, .        
34b00 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20    (i64)(pgno-1) 
34b10 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
34b20 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ze, pPager->page
34b30 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20  Size, &pData.   
34b40 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28     );..      if(
34b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
34b60 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  & pData ){.     
34b70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
34b80 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44  State>PAGER_READ
34b90 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
34ba0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
34bb0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
34bc0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
34bd0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
34be0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
34bf0 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
34c00 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
34c10 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
34c20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  &pPg);.        }
34c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34c40 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
34c50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
34c60 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
34c70 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
34c80 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta);.        }. 
34c90 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29         if( pPg )
34ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
34cb0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
34cc0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  K );.          *
34cd0 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
34ce0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
34cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
34d00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34d10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
34d30 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34d40 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34d50 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20     }..    {.    
34d60 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65    sqlite3_pcache
34d70 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20 20  _page *pBase;.  
34d80 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69      pBase = sqli
34d90 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
34da0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34db0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
34dc0 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
34dd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34de0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53  ite3PcacheFetchS
34df0 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50  tress(pPager->pP
34e00 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42  Cache, pgno, &pB
34e10 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ase);.        if
34e20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34e30 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
34e40 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34e50 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29    if( pBase==0 )
34e60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 20  {.          pPg 
34e70 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20  = *ppPage = 0;. 
34e80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
34e90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
34ea0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34eb0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34ed0 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50        pPg = *ppP
34ee0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
34ef0 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70  cheFetchFinish(p
34f00 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34f10 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20  pgno, pBase);.  
34f20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 21      assert( pPg!
34f30 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
34f40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
34f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
34f60 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
34f70 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
34f80 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
34f90 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
34fa0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
34fb0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34fc0 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
34fd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
34fe0 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
34ff0 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
35000 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
35010 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
35020 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
35030 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
35040 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35050 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
35060 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20  ==(*ppPage) );. 
35070 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
35080 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
35090 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
350a0 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67  r==pPager || pPg
350b0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
350c0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
350d0 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
350e0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
350f0 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
35100 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
35110 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
35120 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
35130 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
35140 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
35150 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
35160 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
35170 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
35180 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
35190 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
351a0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
351b0 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b  PAGER_STAT_HIT]+
351c0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  +;.    return SQ
351d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
351e0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
351f0 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
35200 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
35210 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
35220 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
35230 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
35240 2a 2f 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  */..    pPg->pPa
35250 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
35260 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
35270 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
35280 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
35290 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
352a0 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
352b0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
352c0 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
352d0 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
352e0 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
352f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
35300 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
35310 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
35320 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
35330 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35340 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35350 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
35360 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
35380 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
35390 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
353a0 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
353b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
353c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
353d0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
353e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
353f0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
35400 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
35410 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35430 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
35440 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
35450 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
35460 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
35470 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
35480 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
35490 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
354a0 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
354b0 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
354c0 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
354d0 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
354e0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
354f0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
35500 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
35510 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
35520 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
35530 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
35540 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
35550 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
35560 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
35570 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
35580 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
35590 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
355a0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
355b0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
355c0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
355d0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
355e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
355f0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
35600 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
35610 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
35620 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
35630 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35640 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
35650 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
35660 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
35670 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
35680 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
35690 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
356a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
356b0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
356c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
356d0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
356e0 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
356f0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
35700 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
35710 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
35720 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
35730 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
35740 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
35750 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
35760 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
35770 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30  r) && bMmapOk==0
35780 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35790 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
357a0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
357b0 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
357c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
357d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
357e0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
357f0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
35800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
35810 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
35820 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
35830 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
35840 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20  AT_MISS]++;.    
35850 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
35860 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
35870 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
35880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35890 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
358a0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
358b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
358c0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
358d0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
358e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
358f0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35900 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
35910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
35920 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
35930 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
35940 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
35950 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
35960 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70  (pPager);..  *pp
35970 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
35980 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35990 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
359a0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
359b0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
359c0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
359d0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
359e0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
359f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
35a00 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
35a10 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
35a20 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
35a30 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
35a40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
35a50 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
35a60 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
35a70 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
35a80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
35a90 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
35aa0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
35ab0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
35ac0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
35ad0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
35ae0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
35af0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
35b00 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
35b10 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
35b20 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
35b30 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
35b40 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
35b50 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
35b60 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
35b70 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
35b80 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
35b90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  {.  sqlite3_pcac
35ba0 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a  he_page *pPage;.
35bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35bc0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
35bd0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
35be0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
35bf0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50  Cache!=0 );.  pP
35c00 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
35c10 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
35c20 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
35c30 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  0);.  assert( pP
35c40 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  age==0 || pPager
35c50 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
35c60 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ock );.  if( pPa
35c70 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
35c80 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
35c90 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
35ca0 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
35cb0 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  che, pgno, pPage
35cc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
35cd0 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
35ce0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
35cf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
35d00 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
35d10 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
35d20 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
35d30 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
35d40 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
35d50 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
35d60 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
35d70 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
35d80 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
35d90 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
35da0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
35db0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
35dc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
35dd0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44  erUnrefNotNull(D
35de0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
35df0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
35e00 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29  assert( pPg!=0 )
35e10 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67  ;.  pPager = pPg
35e20 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
35e30 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
35e40 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70  DR_MMAP ){.    p
35e50 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
35e60 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
35e70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
35e80 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
35e90 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
35ea0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
35eb0 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  r);.}.void sqlit
35ec0 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
35ed0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
35ee0 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61   pPg ) sqlite3Pa
35ef0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
35f00 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPg);.}../*.** T
35f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35f20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
35f30 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
35f40 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
35f50 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
35f60 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
35f70 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
35f80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
35f90 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
35fa0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
35fb0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
35fc0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
35fd0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
35fe0 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
35ff0 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
36000 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
36010 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
36020 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
36030 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
36040 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
36050 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
36060 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
36070 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
36080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
36090 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
360a0 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
360b0 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
360c0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
360d0 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
360e0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
360f0 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
36100 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
36110 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
36120 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
36130 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
36140 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
36150 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
36160 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
36170 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
36180 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
36190 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
361a0 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
361b0 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
361c0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
361d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
361e0 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
361f0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
36200 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
36210 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
36220 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
36230 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
36240 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
36250 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
36260 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
36270 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
36280 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
36290 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
362a0 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
362b0 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
362c0 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
362d0 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
362e0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
362f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
36300 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
36310 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
36320 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
36330 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
36340 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
36350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36360 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
36370 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
36380 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
36390 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
363a0 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
363b0 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
363c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
363d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
363e0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
363f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
36400 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
36410 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
36420 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
36430 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
36440 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
36450 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
36460 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
36470 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
36480 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
36490 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
364a0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
364b0 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
364c0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
364d0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
364e0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
364f0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
36500 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
36510 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
36520 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
36530 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
36540 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
36550 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
36560 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50  DE_OFF ){.    pP
36570 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
36580 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
36590 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
365a0 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
365b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
365c0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
365d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
365e0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  EM;.    }.  .   
365f0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
36600 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
36610 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
36620 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  pen. */.    if( 
36630 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
36640 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
36650 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
36660 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
36670 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
36680 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
36690 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
366a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
366b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
366c0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
366d0 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20  ags =           
366e0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
366f0 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75  lags to open jou
36700 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20  rnal file */.   
36710 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
36720 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
36730 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
36740 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
36750 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
36760 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
36770 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
36780 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
36790 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
367a0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53  :.            (S
367b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
367c0 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
367d0 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f     );..        /
367e0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
367f0 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c  e database still
36800 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
36810 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65  me as it did whe
36820 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  n.        ** it 
36830 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  was originally o
36840 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  pened. */.      
36850 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49    rc = databaseI
36860 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
36870 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
36890 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
368a0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
368b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
368c0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
368d0 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
368e0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
368f0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
36900 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
36910 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
36920 67 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 29  ger).          )
36930 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
36940 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
36950 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
36960 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
36970 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
36980 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
36990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
369a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
369b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
369c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
369d0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
369e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
369f0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
36a00 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
36a10 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
36a20 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
36a30 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
36a40 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
36a50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
36a70 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
36a80 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
36a90 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
36aa0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
36ab0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
36ac0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
36ad0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
36ae0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
36af0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
36b00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
36b10 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
36b20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
36b30 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
36b40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
36b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36b60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
36b70 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
36b80 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
36b90 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36ba0 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
36bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36bc0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36bd0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
36be0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
36bf0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
36c00 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
36c10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
36c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
36c30 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
36c40 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
36c50 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
36c60 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
36c70 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
36c80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
36c90 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
36ca0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
36cb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
36cc0 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
36cd0 20 30 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65   0, then acquire
36ce0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
36cf0 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
36d00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36d10 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
36d20 3e 30 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  >0, then acquire
36d30 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20   at least.** an 
36d40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
36d50 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
36d60 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
36d70 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66  no locking .** f
36d80 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65  unctions need be
36d90 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
36da0 66 20 28 65 78 46 6c 61 67 3c 30 29 20 61 6e 64  f (exFlag<0) and
36db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
36dc0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 64 6f   in WAL mode, do
36dd0 20 6e 6f 74 20 74 61 6b 65 20 61 6e 79 20 6c 6f   not take any lo
36de0 63 6b 73 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e  cks..** The tran
36df0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 75 6e  saction will run
36e00 20 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 6d   in CONCURRENT m
36e10 6f 64 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ode instead..**.
36e20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
36e30 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
36e40 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
36e50 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
36e60 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
36e70 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
36e80 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
36e90 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
36ea0 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
36eb0 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
36ec0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
36ed0 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
36ee0 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
36ef0 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
36f00 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
36f10 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
36f20 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
36f30 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
36f40 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
36f50 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
36f60 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
36f70 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
36f80 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
36f90 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
36fa0 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
36fb0 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
36fc0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
36fd0 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
36fe0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
36ff0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
37000 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
37010 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
37020 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
37030 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
37040 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
37050 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
37060 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
37070 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
37080 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
37090 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
370a0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
370b0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
370c0 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
370d0 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
370e0 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
370f0 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
37100 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
37110 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37120 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
37130 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
37140 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
37150 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
37160 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
37170 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
37180 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  ager is configur
37190 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e  ed to use lockin
371a0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
371b0 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a  , and an.      *
371c0 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
371d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
371e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
371f0 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20  held, obtain it 
37200 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  now..      */.  
37210 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
37220 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
37230 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
37240 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
37250 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  >pWal, -1) ){.  
37260 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
37270 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
37280 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
37290 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
372a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
372b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
372c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
372d0 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
372e0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
372f0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
37300 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
37310 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
37320 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
37330 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
37340 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
37350 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
37360 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
37370 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
37380 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
37390 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
373a0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
373b0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
373c0 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
373d0 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
373e0 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
373f0 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
37400 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
37410 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
37420 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
37430 69 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  it.  */.      if
37440 28 20 65 78 46 6c 61 67 3e 3d 30 20 29 7b 0a 20  ( exFlag>=0 ){. 
37450 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
37460 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
37470 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
37480 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20  er->pWal);.     
37490 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
374a0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
374b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
374c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
374d0 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
374e0 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
374f0 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
37500 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
37510 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
37520 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
37530 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
37540 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
37550 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
37560 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
37570 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
37580 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
37590 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
375a0 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
375b0 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
375c0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
375d0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
375e0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
375f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
37600 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
37610 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  lag>0 ){.       
37620 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
37630 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
37640 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
37650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37660 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
37670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37680 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
37690 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
376a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
376b0 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
376c0 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
376d0 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
376e0 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
376f0 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
37700 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
37710 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
37720 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
37730 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
37740 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
37750 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
37760 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
37770 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
37780 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
37790 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
377a0 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
377b0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
377c0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
377d0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
377e0 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
377f0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
37800 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
37810 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
37820 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
37830 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
37840 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
37850 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37860 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
37870 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
37880 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
37890 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
378a0 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
378b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
378c0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
378d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
378e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
378f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
37900 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
37910 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37920 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
37930 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
37940 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
37950 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
37960 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
37970 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37980 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
37990 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
379a0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
379b0 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
379c0 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
379d0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
379e0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
379f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37a00 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65  /*.** Write page
37a10 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e   pPg onto the en
37a20 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  d of the rollbac
37a30 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  k journal..*/.st
37a40 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
37a50 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64  LINE int pagerAd
37a60 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a  dPageToRollbackJ
37a70 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
37a80 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
37a90 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
37aa0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  r;.  int rc;.  u
37ab0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72  32 cksum;.  char
37ac0 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20   *pData2;.  i64 
37ad0 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  iOff = pPager->j
37ae0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
37af0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
37b00 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
37b10 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
37b20 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f  age that.  ** co
37b30 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
37b40 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
37b50 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
37b60 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74   verifies.  ** t
37b70 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
37b80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
37b90 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
37ba0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
37bb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37bc0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
37bd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37be0 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50  f );.  CODEC2(pP
37bf0 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
37c00 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
37c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
37c20 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
37c30 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
37c40 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
37c50 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20  )pData2);..  /* 
37c60 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
37c70 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
37c80 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
37c90 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a  rnalling the.  *
37ca0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
37cb0 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
37cc0 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
37cd0 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
37ce0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
37cf0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
37d00 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
37d10 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
37d20 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f  n.  ** playback_
37d30 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
37d40 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
37d50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
37d60 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e  restored.  ** in
37d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37d80 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
37d90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
37da0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
37db0 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
37dc0 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
37dd0 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
37de0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
37df0 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  YNC;..  rc = wri
37e00 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
37e10 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
37e20 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  >pgno);.  if( rc
37e30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37e40 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
37e50 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
37e60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
37e70 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
37e80 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
37e90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37ea0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37eb0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
37ec0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
37ed0 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
37ee0 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
37ef0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
37f00 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
37f10 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  ;..  IOTRACE(("J
37f20 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
37f30 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
37f40 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
37f50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37f60 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
37f70 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 50  >pageSize));.  P
37f80 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
37f90 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
37fa0 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54 52  ount);.  PAGERTR
37fb0 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
37fc0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
37fd0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
37fe0 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45 52  n",.       PAGER
37ff0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
38000 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28  >pgno, .       (
38010 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
38020 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
38030 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
38040 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50 61  h(pPg)));..  pPa
38050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
38060 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70  += 8 + pPager->p
38070 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  ageSize;.  pPage
38080 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73  r->nRec++;.  ass
38090 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
380a0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
380b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
380c0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
380d0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
380e0 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
380f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
38100 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EM );.  assert( 
38110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
38120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
38130 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64  M );.  rc |= add
38140 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
38150 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
38160 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
38170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
38180 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
38190 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
381a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
381b0 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
381c0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
381d0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
381e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
381f0 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
38200 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
38210 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
38220 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
38230 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
38240 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
38250 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
38260 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
38270 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
38280 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
38290 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
382a0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
382b0 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
382c0 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
382d0 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
382e0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
382f0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
38300 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
38310 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
38320 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
38330 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
38340 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
38350 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
38360 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74  ed unless a writ
38370 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
38380 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20  s already .  ** 
38390 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68  been started. Th
383a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
383b0 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
383c0 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
383d0 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  int..  ** It is 
383e0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
383f0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
38400 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
38410 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
38420 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
38430 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  KED.       || pP
38440 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
38450 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
38460 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
38470 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
38480 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
38490 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
384a0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
384b0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
384c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
384d0 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  errCode==0 );.  
384e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
384f0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
38500 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
38510 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
38520 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
38530 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67  o be opened. Hig
38540 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
38550 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  es have already.
38560 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68    ** obtained th
38570 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
38580 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77  s to begin the w
38590 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
385a0 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72  , but the.  ** r
385b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
385c0 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
385d0 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e   open. Open it n
385e0 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ow if this is th
385f0 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e case..  **.  *
38600 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  * This is done b
38610 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71  efore calling sq
38620 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
38630 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61  irty() on the pa
38640 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ge. .  ** Otherw
38650 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20  ise, if it were 
38660 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69  done after calli
38670 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
38680 4d 61 6b 65