/ Hex Artifact Content
Login

Artifact a55adacb1842b83354198c408e7adde95ecd1189:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  f.};../*.** A op
5240: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
5250: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5260: 73 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20  struct Pager. A 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
5280: 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f  * some of the mo
5290: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d  re important mem
52a0: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f  ber variables fo
52b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74  llows:.**.** eSt
52c0: 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ate.**.**   The 
52d0: 63 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20  current 'state' 
52e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
52f0: 65 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  ect. See the com
5300: 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a  ment and state.*
5310: 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76  *   diagram abov
5320: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
5330: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
5340: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c   state..**.** eL
5350: 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ock.**.**   For 
5360: 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64  a real on-disk d
5370: 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72  atabase, the cur
5380: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
5390: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
53a0: 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  ile -.**   NO_LO
53b0: 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
53c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
53d0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
53e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  ..**.**   For a 
53f0: 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
5400: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
5410: 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63  (neither of whic
5420: 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a  h require any.**
5430: 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20     locks), this 
5440: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
5450: 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53  ys set to EXCLUS
5460: 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20  IVE_LOCK. Since 
5470: 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61  such.**   databa
5480: 73 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20  ses always have 
5490: 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d  Pager.exclusiveM
54a0: 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69  ode==1, this tri
54b0: 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  cks the pager.**
54c0: 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68     logic into th
54d0: 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61  inking that it a
54e0: 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74  lready has all t
54f0: 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c  he locks it will
5500: 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20   ever.**   need 
5510: 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74  (and no reason t
5520: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e  o release them).
5530: 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65  .**.**   In some
5540: 20 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75   (obscure) circu
5550: 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76  mstances, this v
5560: 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f  ariable may also
5570: 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20   be set to.**   
5580: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
5590: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
55a0: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
55b0: 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  of UNKNOWN_LOCK 
55c0: 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73  for.**   details
55d0: 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f  ..**.** changeCo
55e0: 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20  untDone.**.**   
55f0: 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72  This boolean var
5600: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
5610: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5620: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5630: 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d  er .**   (the 4-
5640: 62 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c  byte header fiel
5650: 64 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  d at byte offset
5660: 20 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62   24 of the datab
5670: 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a  ase file) is .**
5680: 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d     not updated m
5690: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e  ore often than n
56a0: 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a  ecessary. .**.**
56b0: 20 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20     It is set to 
56c0: 74 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68  true when the ch
56d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
56e0: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77  ld is updated, w
56f0: 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f  hich .**   can o
5700: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e  nly happen if an
5710: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
5720: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
5730: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
5740: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
5750: 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20   (set to false) 
5760: 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c  whenever an excl
5770: 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  usive lock is .*
5780: 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64  *   relinquished
5790: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
57a0: 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65   file. Each time
57b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
57c0: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20  s committed,.** 
57d0: 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e    The changeCoun
57e0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e  tDone flag is in
57f0: 73 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69  spected. If it i
5800: 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b  s true, the work
5810: 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e   of.**   updatin
5820: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
5830: 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  nter is omitted 
5840: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5850: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
5860: 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e  **   This mechan
5870: 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ism means that w
5880: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  hen running in e
5890: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61  xclusive mode, a
58a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
58b0: 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61    need only upda
58c0: 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
58d0: 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20  unter once, for 
58e0: 74 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61  the first transa
58f0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69  ction.**   commi
5900: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d  tted..**.** setM
5910: 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68  aster.**.**   Wh
5920: 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  en PagerCommitPh
5930: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
5940: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74  ed to commit a t
5950: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
5960: 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20  ay.**   (or may 
5970: 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d  not) specify a m
5980: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
5990: 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  me to be written
59a0: 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20   into the .**   
59b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
59c0: 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64  ore it is synced
59d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
59e0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
59f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
5a00: 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65  contains a maste
5a10: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5a20: 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20  r affects .**   
5a30: 74 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68  the way in which
5a40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5a50: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61  e is finalized a
5a60: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
5a70: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f  tion is .**   co
5a80: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5a90: 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e  d back when runn
5aa0: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5ab0: 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f  mode=PERSIST" mo
5ac0: 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f  de..**   If a jo
5ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
5ae0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  not contain a ma
5af0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b00: 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20  nter, it is.**  
5b10: 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76   finalized by ov
5b20: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5b30: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
5b40: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20  er with zeroes. 
5b50: 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20  If.**   it does 
5b60: 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72  contain a master
5b70: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5b90: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a  e is finalized .
5ba0: 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69  **   by truncati
5bb0: 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  ng it to zero by
5bc0: 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20  tes, just as if 
5bd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
5be0: 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e  ere .**   runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64  de=truncate" mod
5c10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e  e..**.**   Journ
5c20: 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f  al files that co
5c30: 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75  ntain master jou
5c40: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61  rnal pointers ca
5c50: 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65  nnot be finalize
5c60: 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79  d.**   simply by
5c70: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c80: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
5c90: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5ca0: 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d  s, as the.**   m
5cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
5cc0: 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65  inter could inte
5cd0: 72 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a  rfere with hot-j
5ce0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
5cf0: 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73  of any.**   subs
5d00: 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75  equently interru
5d10: 70 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  pted transaction
5d20: 20 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65   that reuses the
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5d40: 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20  *.**   The flag 
5d50: 69 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f  is cleared as so
5d60: 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  on as the journa
5d70: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5d80: 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20  zed (either.**  
5d90: 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50   by PagerCommitP
5da0: 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72  haseTwo or Pager
5db0: 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e  Rollback). If an
5dc0: 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e   IO error preven
5dd0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72  ts the.**   jour
5de0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
5df0: 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ing successfully
5e00: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
5e10: 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a  setMaster flag.*
5e20: 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61  *   is cleared a
5e30: 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70  nyway (and the p
5e40: 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74  ager will move t
5e50: 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a  o ERROR state)..
5e60: 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c  **.** doNotSpill
5e70: 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  , doNotSyncSpill
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74  .**.**   These t
5e90: 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  wo boolean varia
5ea0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5eb0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74  */..  u8 bUseFet
7c70: 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
7c80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7c90: 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69   xFetch() */.  i
7ca0: 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20  nt nMmapOut;    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7cc0: 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67  mber of mmap pag
7cd0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  es currently out
7ce0: 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  standing */.  sq
7cf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
7d00: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73  ap;       /* Des
7d10: 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  ired maximum mma
7d20: 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64  p size */.  PgHd
7d30: 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r *pMmapFreelist
7d40: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
7d50: 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67  of free mmap pag
7d60: 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74  e headers (pDirt
7d70: 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y) */.  /*.  ** 
7d80: 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69  End of the routi
7d90: 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c  nely-changing cl
7da0: 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a  ass members.  **
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31  *********/..  u1
7e00: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7e20: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
7e30: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7e40: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
7e50: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
7e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e70: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
7e80: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
7e90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
7ea0: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
7eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7ec0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
7ed0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33  .xOpen() */.  u3
7ee0: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
7ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
7f00: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
7f10: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
7f20: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
7f30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f50: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
7f60: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
7f90: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
7fa0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34  atabase */.  i64
7fb0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
7fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
7fd0: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
7fe0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
7ff0: 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  les */.  char *z
8000: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
8010: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8020: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
8040: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
8050: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
8070: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
8080: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
8090: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
80a0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
80b0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
80c0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
80d0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
80e0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
80f0: 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74  ler */.  int aSt
8100: 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  at[3];          
8110: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61       /* Total ca
8120: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73  che hits, misses
8130: 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23   and writes */.#
8140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8150: 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  T.  int nRead;  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8180: 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  s read */.#endif
8190: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
81a0: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
81b0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
81c0: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
81d0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
81e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
81f0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
8200: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
8210: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
8220: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
8230: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8240: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8250: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8260: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8270: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8280: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8290: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
82a0: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
82b0: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
82c0: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
82d0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
82e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
82f0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
8300: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
8310: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
8320: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
8330: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8340: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8350: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8360: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8370: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8380: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8390: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
83a0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
83b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
83c0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
83d0: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
83e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
83f0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
8400: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
8410: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
8420: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
8430: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8440: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8450: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8460: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8470: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8480: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8490: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
84a0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
84b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
84c0: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
84d0: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
84e0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
84f0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8500: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8510: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8520: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8530: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8540: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8550: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8560: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8570: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68  RITE 2../*.** Th
8580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
8590: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
85a0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
85b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
85c0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
85d0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
85e0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
85f0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
8600: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
8610: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
8620: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
8630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8640: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
8650: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
8660: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8670: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8680: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
8690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86a0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
86b0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
86c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
86d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
86e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86f0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
8700: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
8710: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
8720: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
8730: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
8740: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
8750: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
8760: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
8770: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
8780: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
8790: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
87a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
87b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
87c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
87d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
87e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
87f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
8800: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
8810: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
8820: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8830: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
8840: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
8850: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8860: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
8870: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
8880: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
88a0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
88b0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
88c0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
88d0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
88e0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
88f0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
8900: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
8910: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
8920: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
8930: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
8940: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
8950: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
8960: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8970: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
8980: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
8990: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
89a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
89b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
89c0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
89d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
89e0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
89f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8a00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
8a10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
8a20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
8a30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
8a40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
8a50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8a60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
8a70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
8a80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
8a90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
8aa0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
8ab0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
8ac0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
8ad0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
8ae0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8af0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8b00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8b10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8b20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8b30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8b40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8b50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8b60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8b70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8b80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
8b90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
8ba0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
8bb0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
8bc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
8bd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
8be0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8bf0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8c00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8c10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8c20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8c30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8c40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8c50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8c60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8c70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8c80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
8c90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8ca0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
8cb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
8cc0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
8cd0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
8ce0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8cf0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8d00: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8d10: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8d20: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8d30: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8d40: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8d50: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8d60: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8d70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8d80: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
8d90: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8da0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8db0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
8dc0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
8dd0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
8de0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8df0: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8e00: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8e10: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8e30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8e40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8e50: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8e60: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8e70: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8e80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
8e90: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
8ea0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
8eb0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
8ec0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
8ed0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
8ee0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8ef0: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8f00: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8f10: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8f20: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8f30: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8f40: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8f60: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8f70: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8f80: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
8f90: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
8fa0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  f../*.** The mac
8fb0: 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74  ro USEFETCH is t
8fc0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c  rue if we are al
8fd0: 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65  lowed to use the
8fe0: 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66   xFetch and xUnf
8ff0: 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63  etch.** interfac
9000: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9010: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
9020: 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
9030: 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  O..*/.#if SQLITE
9040: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
9050: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9060: 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65  CH(x) ((x)->bUse
9070: 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64  Fetch).#else.# d
9080: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
9090: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
90a0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
90b0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
90c0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
90d0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
90e0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
90f0: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  647../*.** The a
9100: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
9110: 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20  macro is a file 
9120: 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65  descriptor (type
9130: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e   sqlite3_file*).
9140: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
9150: 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  it is not open, 
9160: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74  or non-zero (but
9170: 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73   not 1) if it is
9180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9190: 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69  so that expressi
91a0: 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74  ons can be writt
91b0: 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  en as:.**.**   i
91c0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
91d0: 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a  ->jfd) ){ ....**
91e0: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  .** instead of.*
91f0: 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65  *.**   if( pPage
9200: 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
9210: 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69   ){ ....*/.#defi
9220: 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28  ne isOpen(pFd) (
9230: 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29  (pFd)->pMethods)
9240: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9250: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
9260: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
9270: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
9280: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
9290: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
92a0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
92b0: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
92c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
92d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
92e0: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
92f0: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
9300: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
9310: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9320: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9330: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9340: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9350: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9360: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
9370: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
9380: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
9390: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
93a0: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
93b0: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
93c0: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
93d0: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
93e0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
93f0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9400: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9410: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9420: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9430: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9440: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9450: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9460: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
9470: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
9480: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
9490: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
94a0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
94b0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
94c0: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
94d0: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
94e0: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
94f0: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9500: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9510: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9520: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9530: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9540: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9550: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9560: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9570: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9580: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
9590: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
95a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
95b0: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
95c0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
95d0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
95e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
95f0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9600: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9610: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9620: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9630: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9640: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9650: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9660: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9670: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9680: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9690: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
96a0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
96b0: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
96c0: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
96d0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
96e0: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
96f0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9700: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9710: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9720: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9730: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9740: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9750: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9760: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9770: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9780: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9790: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
97a0: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
97b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
97c0: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
97d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
97e0: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
97f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9800: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9810: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9820: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9830: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9840: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9850: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9860: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9870: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9880: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9890: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
98a0: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
98b0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
98c0: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
98d0: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
98e0: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
98f0: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9900: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9910: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9930: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9940: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9950: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9960: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9970: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9980: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9990: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
99a0: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
99b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
99c0: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
99e0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
99f0: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9a00: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9a10: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9a20: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9a30: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9a40: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9a50: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9a60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9a70: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9a80: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9aa0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9ab0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ac0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ad0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
9ae0: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
9af0: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
9b00: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
9b10: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9b20: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
9b30: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
9b40: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
9b50: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
9b60: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
9b70: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
9b80: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
9b90: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
9ba0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
9bb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9bc0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
9bd0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
9be0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9bf0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9c00: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
9c10: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
9c20: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
9c30: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
9c40: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
9c50: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
9c60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c70: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9c80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9c90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ca0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
9cb0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
9cc0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
9cd0: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
9ce0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9cf0: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
9d00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9d10: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9d20: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d40: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d60: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
9d70: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
9d80: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9d90: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9da0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9db0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9dc0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9de0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9df0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e00: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9e10: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9e20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9e30: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9e40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
9e50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e60: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
9e70: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9e80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9e90: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9ea0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
9eb0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
9ec0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ed0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9ee0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
9ef0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9f10: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
9f20: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
9f40: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
9fd0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
9fe0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
9ff0: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a000: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a020: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a030: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a040: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a050: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a060: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a070: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a080: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a090: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a0a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a0b0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a0d0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a0e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a0f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a100: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a110: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a120: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a130: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a150: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a160: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a170: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a190: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a1a0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a1b0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a1c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1d0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a1e0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a1f0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a200: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a210: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a220: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a230: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a240: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a250: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a260: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a270: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a280: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a290: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2b0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a2c0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a2d0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a2e0: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a320: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a330: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a340: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a350: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a360: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a370: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a380: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a390: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a3a0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a3b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a3c0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a3d0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a3e0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a3f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a400: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a410: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a420: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a430: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a450: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a460: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a470: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a480: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a490: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a4a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a4b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a4c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a4d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a4e0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a4f0: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a500: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a510: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a520: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a530: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a540: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a550: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a560: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a570: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a580: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a590: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a5a0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5c0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a5d0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a5e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a5f0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a600: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a620: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a630: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a640: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a650: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a660: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a670: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a680: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a690: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a6a0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a6b0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a6c0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a6d0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a6e0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a6f0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a700: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a710: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a720: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a730: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a740: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a750: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a760: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a770: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a780: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a790: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a7a0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a7b0: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a7c0: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
a7d0: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
a7e0: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
a7f0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
a800: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
a810: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
a820: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
a830: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
a840: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
a850: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
a860: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
a870: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a880: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
a890: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
a8a0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
a8b0: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
a8c0: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
a8d0: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
a8e0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
a8f0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
a900: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
a910: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
a920: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
a930: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
a940: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
a950: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
a960: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
a970: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
a980: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
a990: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
a9a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a9b0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
a9c0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
a9d0: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
a9e0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a9f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
aa00: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
aa10: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
aa30: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
aa40: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
aa50: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
aa60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aa70: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
aa80: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
aa90: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
aaa0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
aab0: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
aac0: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
aad0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aae0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
aaf0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ab00: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ab10: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ab20: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ab30: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
ab40: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ab50: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ab60: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ab70: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ab80: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ab90: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
aba0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
abb0: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
abc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
abd0: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
abe0: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
abf0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
ac00: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
ac10: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
ac20: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
ac30: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
ac40: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
ac50: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
ac60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
ac80: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
ac90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aca0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
acb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
acc0: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
acd0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ace0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
acf0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
ad00: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
ad10: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ad20: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ad30: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ad40: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
ad50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ad60: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ad70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
ad80: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
ad90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
ada0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
adb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
adc0: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
add0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ade0: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
adf0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
ae00: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
ae10: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
ae20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
ae30: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
ae40: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
ae50: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
ae60: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
ae70: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
ae80: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
ae90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
aea0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
aeb0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
aec0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
aed0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
aee0: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
aef0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
af00: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
af10: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
af20: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
af30: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
af40: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
af50: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
af60: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
af70: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
af80: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
af90: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
afa0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
afb0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
afc0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
afd0: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
afe0: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
aff0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b010: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b020: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b030: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b040: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
b050: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
b060: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
b070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b080: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b090: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
b0a0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
b0b0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b0c0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b0d0: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b0e0: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b0f0: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b100: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b120: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b130: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
b140: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b150: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b160: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b170: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b180: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b190: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
b1a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b1b0: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
b1c0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b1d0: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b1e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b1f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b200: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b210: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b220: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b230: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b240: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b250: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b260: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b270: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b280: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b290: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b2a0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b2b0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b2c0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b2d0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b2e0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b2f0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b300: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b310: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b320: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b330: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b340: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b350: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b360: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b370: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b380: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b390: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b3b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b3c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b3d0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b3e0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b3f0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b400: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b410: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b420: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b430: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b440: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b450: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b460: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b470: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b480: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b490: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b4a0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b4b0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b4d0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b4e0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b4f0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b500: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b510: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b520: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b530: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b540: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b550: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b560: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b570: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b580: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b590: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b5a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b5b0: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b5c0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b5d0: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b5e0: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b5f0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b600: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b610: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b620: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b630: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b640: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b650: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b660: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b670: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b680: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b690: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b6a0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b6b0: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b6c0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b6d0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b6e0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b6f0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b700: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b710: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b720: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b730: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b740: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b750: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b760: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b770: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b780: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b790: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b7b0: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b7c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b7d0: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b7e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b7f0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b800: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b810: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b820: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
b830: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
b840: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
b850: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
b860: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b870: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
b880: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
b890: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b8a0: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
b8b0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
b8c0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
b8d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
b8e0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b8f0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b900: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b910: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
b920: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
b930: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
b940: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
b950: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
b960: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
b970: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
b980: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
b990: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
b9a0: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
b9b0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b9c0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b9d0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b9e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
b9f0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
ba00: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
ba10: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
ba20: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
ba30: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
ba40: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
ba50: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
ba60: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
ba70: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
ba80: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
ba90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
baa0: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
bab0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bac0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
bad0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bae0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
baf0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bb00: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
bb10: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
bb20: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
bb30: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
bb40: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
bb50: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
bb60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
bb70: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bb80: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bb90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bba0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bbb0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bbc0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bbd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bbe0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bbf0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bc00: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
bc10: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bc20: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bc30: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bc50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bc60: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bc70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bc80: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bc90: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bca0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bcb0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bcc0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bcd0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bce0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bcf0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bd00: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bd10: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bd20: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bd30: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bd40: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bd50: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bd60: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bd70: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bd80: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bd90: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bda0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bdb0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bdc0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bdd0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bde0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bdf0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
be00: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
be10: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
be20: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
be30: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
be40: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
be50: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
be60: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
be70: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
be80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
be90: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
bea0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
beb0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
bec0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
bed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
bee0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
bef0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
bf00: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
bf10: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
bf20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
bf30: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
bf40: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
bf50: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
bf60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
bf70: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
bf80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
bf90: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
bfc0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
bfd0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
bfe0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c000: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c010: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c040: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c050: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c060: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c070: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c080: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c090: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c0a0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c0b0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c0c0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c0d0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c0e0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c0f0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c100: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c110: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c120: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c130: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c140: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c150: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c160: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c170: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c180: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c1a0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c1b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c1c0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c1d0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c1e0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c1f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c200: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c210: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c220: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c230: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c240: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c250: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c260: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c270: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c280: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c290: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c2a0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c2b0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c2c0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c2d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c2e0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c2f0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c300: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c310: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c320: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c330: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c340: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c350: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c360: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c370: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c390: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c3a0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c3b0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c3c0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c3d0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c3e0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c3f0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c400: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c410: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c420: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c430: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c440: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c460: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c470: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c480: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c490: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c4a0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c4b0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c4c0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c4d0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c4e0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c4f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c500: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c510: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c520: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c530: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c540: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c550: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c560: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c570: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c580: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c590: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c5a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c5b0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c5c0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c5d0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c5e0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c5f0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c600: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c610: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c620: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c630: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c640: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c650: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c660: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c670: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c680: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c690: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c6a0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c6b0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c6c0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c6e0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c6f0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c700: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c710: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c720: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c730: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c740: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c750: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c760: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c770: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c780: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c790: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c7a0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c7b0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c7c0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c7d0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c7e0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c7f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c800: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
c810: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
c820: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
c830: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
c840: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
c850: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
c860: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
c870: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
c880: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
c890: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
c8a0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
c8b0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
c8c0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
c8d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c8e0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
c8f0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
c900: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
c910: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
c920: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
c930: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
c940: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
c950: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
c960: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
c970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c980: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
c990: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
c9a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
c9b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c9c0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c9d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c9e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
c9f0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
ca00: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ca10: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ca20: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ca30: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
ca40: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ca50: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
ca60: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
ca70: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
ca80: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
ca90: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
caa0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cab0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cac0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cad0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cae0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
caf0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cb00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cb10: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cb20: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cb30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cb40: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cb50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cb60: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cb70: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cb80: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cb90: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cba0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cbb0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cbc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cbd0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cbe0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cbf0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cc00: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cc10: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cc20: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc30: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc50: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cc60: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cc70: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cc80: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cca0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
ccb0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ccc0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
ccf0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cd00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cd10: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cd20: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cd30: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cd40: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cd50: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cd60: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cd70: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cd80: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cd90: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cda0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cdb0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cdc0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cdd0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cde0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cdf0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ce00: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
ce10: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
ce20: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
ce30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
ce40: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
ce50: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
ce60: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
ce70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
ce80: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
ce90: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cea0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
ceb0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
cec0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
ced0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
cee0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
cef0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
cf00: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
cf10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cf20: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
cf30: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
cf40: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
cf50: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
cf60: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
cf70: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
cf80: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
cf90: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
cfa0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
cfb0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
cfc0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
cfd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
cfe0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
cff0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d000: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d010: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d020: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d030: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d040: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d050: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d060: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d070: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d080: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d090: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d0a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d0c0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d0d0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d0e0: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d0f0: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d100: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d110: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d120: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d130: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d140: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d150: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d160: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d170: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d180: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d190: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d1a0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d200: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d210: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d220: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d230: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d240: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d260: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d270: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d280: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d290: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d2a0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d2b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d2c0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d2d0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d2e0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d2f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d300: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d310: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d320: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d340: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d350: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d360: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d370: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d380: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d3a0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d3b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d3c0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d3d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d3e0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d400: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d420: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d430: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d440: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d450: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d460: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d470: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d480: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d490: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d4a0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d4b0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d4c0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
d4d0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
d4e0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
d4f0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
d500: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
d510: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
d520: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
d530: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
d540: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
d550: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
d560: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
d570: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
d580: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
d590: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
d5a0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
d5b0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
d5c0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
d5d0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
d5e0: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
d5f0: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
d600: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
d610: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
d620: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
d630: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
d640: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
d650: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
d660: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
d670: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
d680: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
d690: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d6a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d6b0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
d6c0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
d6d0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
d6e0: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
d6f0: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
d700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d710: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
d720: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d730: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
d740: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
d750: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
d760: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
d770: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
d780: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
d790: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
d7a0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
d7b0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
d7c0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
d7d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d800: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
d810: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
d820: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
d830: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
d840: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
d850: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
d860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
d870: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
d880: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
d890: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
d8a0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
d8b0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
d8c0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
d8d0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
d910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d920: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d930: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
d940: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
d950: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d960: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
d970: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
d980: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
d990: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d9a0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
d9b0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
d9c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d9d0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
d9e0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
d9f0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
da00: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
da10: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
da20: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
da30: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
da40: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
da50: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
da60: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
da70: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
da80: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
da90: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
daa0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dab0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
dac0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
dad0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
dae0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
daf0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
db00: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
db10: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
db20: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
db30: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
db40: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
db50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
db60: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
db70: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
db80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
db90: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
dba0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
dbb0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
dbc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
dbd0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
dbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dbf0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
dc00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc10: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dc20: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dc30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dc50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dc60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dc70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
dc80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dc90: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
dca0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
dcb0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
dcc0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
dcd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dce0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
dcf0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
dd00: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
dd10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
dd20: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
dd30: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
dd40: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
dd50: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
dd60: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
dd70: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
dd80: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
dd90: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
dda0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
ddb0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
ddc0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
ddd0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
dde0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
ddf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
de00: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
de10: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
de20: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
de30: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
de40: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
de50: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
de60: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
de70: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
de80: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
de90: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
dea0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
deb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
dec0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
ded0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
dee0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
def0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df00: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
df10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
df20: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
df30: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
df40: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
df50: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
df60: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
df70: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
df80: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
df90: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
dfa0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
dfb0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
dfc0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
dfe0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
dff0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e000: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e030: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e040: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e050: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e060: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e070: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e080: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e090: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e0a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e0b0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e0c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e0e0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e0f0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e100: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e110: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e120: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e130: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e140: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e150: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e160: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e170: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e180: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e190: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e1a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e1b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e1c0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e1d0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e1e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e1f0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e200: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e210: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e220: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e230: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e240: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e250: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e260: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e270: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e280: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e290: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e2a0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e2b0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e2c0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e2d0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e2e0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e2f0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e300: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e310: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e320: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e330: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e340: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e350: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e360: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e370: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e380: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e390: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e3a0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e3b0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e3c0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e3d0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e3e0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e3f0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e400: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e410: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e430: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e440: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e450: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e460: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e470: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e480: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e490: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e4a0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e4b0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e4c0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e4d0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e4f0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e500: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e510: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e520: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e530: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e540: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e550: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e560: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e570: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e580: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e590: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e5a0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e5b0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e5c0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e5d0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e5e0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e5f0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e600: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e610: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e620: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e630: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e640: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e650: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e660: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e670: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
e680: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
e690: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
e6a0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
e6b0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
e6c0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
e6d0: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
e6e0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
e6f0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
e700: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
e710: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e720: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
e730: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
e740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
e750: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e760: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
e770: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e780: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e790: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
e7a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
e7b0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
e7c0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e7d0: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
e7e0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
e7f0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
e800: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
e810: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
e820: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
e830: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
e840: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e850: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e860: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e870: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
e880: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e890: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
e8a0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
e8b0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
e8c0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e8d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e8e0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
e8f0: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
e900: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
e910: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
e920: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
e930: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e940: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e950: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
e960: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
e970: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
e980: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
e990: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e9a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e9b0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
e9c0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
e9d0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
e9e0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
e9f0: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ea00: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ea10: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ea20: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ea30: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ea40: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ea50: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ea60: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
ea70: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ea80: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ea90: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
eaa0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
eab0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eac0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ead0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eaf0: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
eb00: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
eb10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eb20: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eb30: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eb40: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eb50: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eb60: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eb70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
eb80: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
eb90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
eba0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ebb0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ebc0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ebd0: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ebe0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ebf0: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ec00: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ec10: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
ec20: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
ec30: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
ec40: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
ec50: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
ec60: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
ec70: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
ec80: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
ec90: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
eca0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
ecb0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
ecc0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
ecd0: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
ece0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
ecf0: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
ed00: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
ed10: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
ed20: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
ed30: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
ed40: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
ed50: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
ed60: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
ed70: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
ed80: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
ed90: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
eda0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
edb0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
edc0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
edd0: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
ede0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
edf0: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
ee00: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
ee10: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
ee20: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
ee30: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
ee40: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
ee50: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
ee60: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ee70: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
ee80: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
ee90: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
eea0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
eeb0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
eec0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
eed0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
eee0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
eef0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ef00: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
ef10: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
ef20: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
ef30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
ef40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ef50: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
ef60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
ef70: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
ef80: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
ef90: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
efa0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
efb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
efc0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
efd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
efe0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
eff0: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f000: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f010: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f020: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f030: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f040: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f050: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f060: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f070: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f080: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f090: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f0a0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f0b0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f0c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f0d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f0e0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f0f0: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f100: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f110: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f120: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f130: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f140: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f150: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f160: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f170: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f180: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f190: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f1a0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f1b0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f1c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f1d0: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f1e0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f1f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f200: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f210: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f220: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f230: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f240: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f250: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f260: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f270: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f280: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f290: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f2a0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f2c0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f2d0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f2e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f2f0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f300: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f310: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f320: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f330: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f340: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f350: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f360: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f370: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f380: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f390: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f3a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f3c0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f3d0: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f3e0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f400: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f410: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f420: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f430: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f440: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f450: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f460: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f470: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f490: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f4a0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f4b0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f4c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f4f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f500: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f510: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f520: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f530: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f540: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f560: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f570: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f580: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f590: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f5a0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f5b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f5c0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f5d0: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f5e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f5f0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f600: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f610: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f620: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f630: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f640: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f650: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f660: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f670: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
f680: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f690: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
f6a0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
f6b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f6c0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
f6d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
f6e0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
f6f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f700: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
f710: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
f720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
f730: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
f740: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
f750: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f760: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
f770: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
f780: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
f790: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
f7a0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
f7b0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
f7c0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
f7d0: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
f7e0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
f7f0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f800: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
f810: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
f820: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
f830: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
f840: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
f850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f860: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
f870: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
f880: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
f890: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f8c0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
f8d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f8e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
f8f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f900: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f910: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
f920: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
f930: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
f940: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f950: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
f960: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
f970: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
f980: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
f990: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
f9a0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
f9b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f9c0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
f9d0: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
f9e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
f9f0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fa00: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fa10: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fa20: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fa30: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fa40: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fa50: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fa60: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fa70: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fa80: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fa90: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
faa0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fab0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fac0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fad0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fae0: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
faf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fb00: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fb10: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fb20: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
fb30: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fb40: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fb50: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb70: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
fb80: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
fb90: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
fba0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
fbb0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fbc0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fbd0: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
fbe0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
fbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc10: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
fc20: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
fc30: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fc40: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fc50: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fc60: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fc70: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
fc80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fc90: 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
fca0: 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
fcb0: 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
fcc0: 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
fcd0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
fce0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
fcf0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
fd00: 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
fd10: 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
fd20: 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
fd30: 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
fd40: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
fd50: 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
fd60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
fd70: 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
fd80: 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
fd90: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fda0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fdb0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
fdc0: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
fdd0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
fde0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
fdf0: 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
fe00: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
fe10: 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
fe20: 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
fe30: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
fe40: 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
fe50: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
fe60: 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
fe70: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
fe80: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
fe90: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
fea0: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
feb0: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
fec0: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fed0: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
fee0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
fef0: 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
ff00: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
ff10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ff20: 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
ff30: 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
ff40: 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
ff50: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
ff60: 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
ff70: 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
ff80: 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
ff90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
ffa0: 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
ffb0: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
ffc0: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
ffd0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
ffe0: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
fff0: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10000 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10010 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10020 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10030 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10040 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10050 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10060 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
10070 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10090 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
100a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
100b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
100c0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
100d0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
100e0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
100f0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10100 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10110 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10120 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10130 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10140 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10150 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10160 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
10170 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10180 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10190 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
101a0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
101b0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
101c0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
101d0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
101e0 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
101f0 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10200 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10210 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10220 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10230 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10240 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10250 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10260 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10270 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10280 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10290 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
102a0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
102b0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
102c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
102d0 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
102e0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
102f0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10300 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10310 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10320 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10330 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10340 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10350 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
10370 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10380 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10390 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
103a0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
103b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103c0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
103d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
103e0 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
103f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10400 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10410 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10420 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10430 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10440 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10450 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10460 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
10470 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10490 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
104a0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
104b0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
104c0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
104d0 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
104e0 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
104f0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10500 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10510 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10530 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10540 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10550 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10560 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10570 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10580 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10590 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
105a0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
105b0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
105c0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
105d0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
105e0 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
105f0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10600 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10610 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10620 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10630 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10640 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10650 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10660 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10670 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10680 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10690 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
106a0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
106b0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
106c0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
106d0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
106e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
106f0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10710 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10720 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10750 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10760 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10780 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10790 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
107a0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
107d0 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
107e0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
107f0 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10810 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10820 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10830 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10860 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10870 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10880 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
108a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
108b0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
108c0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
108d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
108e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
108f0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10900 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
10910 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
10920 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
10930 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
10950 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
10960 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
10970 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
10980 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
10990 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
109a0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
109b0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
109c0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
109d0 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
109e0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
109f0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10a00 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10a10 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10a20 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10a30 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10a40 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10a50 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10a60 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10a70 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10a80 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10a90 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10aa0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10ab0 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10ac0 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10ad0 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ae0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10af0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10b00 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10b20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10b30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10b40 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10b50 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10b60 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10b70 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10b80 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10b90 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10ba0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10bb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10bc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10bd0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10be0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10bf0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10c00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10c10 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10c20 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10c30 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10c40 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10c50 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10c60 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10c70 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10c80 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10c90 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10ca0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10cb0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10cc0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10cd0 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ce0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10cf0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10d00 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10d10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10d20 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10d30 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10d40 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10d50 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10d60 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10d70 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10d80 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10d90 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10da0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10db0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10dc0 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10dd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10de0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10df0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10e00 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10e10 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10e20 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10e30 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
10e40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10e50 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
10e60 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
10e70 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
10e80 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
10e90 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
10ea0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
10eb0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
10ec0 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
10ed0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
10ee0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
10ef0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
10f00 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
10f10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
10f20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10f30 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
10f40 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
10f50 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
10f60 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
10f70 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
10f80 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
10f90 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
10fa0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
10fb0 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
10fc0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
10fd0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10fe0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
10ff0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
11000 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
11010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
11020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11030 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11040 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11050 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11060 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11070 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
11080 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
11090 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
110a0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
110b0 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
110c0 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
110d0 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
110e0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
110f0 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
11100 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
11110 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
11120 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
11130 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11140 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11170 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
11180 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
11190 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
111a0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
111b0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
111c0 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
111d0 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
111e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
111f0 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
11200 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
11210 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
11220 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
11230 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11240 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
11250 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
11260 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
11270 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11280 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
11290 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
112a0 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
112b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
112c0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
112d0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
112e0 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
112f0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11320 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11330 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11340 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11350 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11360 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11370 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
11380 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11390 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
113a0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
113b0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
113c0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
113d0 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
113e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
113f0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11400 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11410 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11420 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11430 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11440 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11450 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11460 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11470 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11480 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11490 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
114a0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
114b0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
114c0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
114d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
114e0 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
114f0 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11500 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11510 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11520 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11540 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11550 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11560 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11570 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11580 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11590 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
115a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
115b0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
115c0 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
115d0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
115e0 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
115f0 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11600 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11610 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11620 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11630 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11640 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11650 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11660 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11670 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
11680 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11690 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
116a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
116b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
116c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
116d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
116e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
116f0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11700 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11710 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11720 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11730 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11740 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11750 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11760 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11770 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
11780 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11790 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
117a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
117b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
117c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
117d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
117e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
117f0 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11810 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11820 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
11830 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11840 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11850 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
11860 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
11870 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
11880 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11890 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
118a0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
118b0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
118c0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
118d0 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
118e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
118f0 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11900 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11910 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11920 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11930 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11940 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11950 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11960 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11970 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11980 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11990 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
119a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
119b0 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
119c0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
119d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
119e0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
119f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11a00 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11a10 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11a20 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11a30 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11a40 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11a50 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11a60 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11a70 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11a80 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11a90 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11aa0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11ab0 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11ac0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11ad0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11ae0 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11af0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11b00 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11b10 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11b20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11b30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11b40 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11b50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11b60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11b70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11b80 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11b90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11ba0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11bb0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11bc0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11bd0 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11be0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11bf0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11c00 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11c10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11c20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11c30 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11c40 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11c50 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11c60 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11c70 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11c80 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11c90 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11ca0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11cb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11cc0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11cd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11ce0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11cf0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11d00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11d20 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11d30 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11d40 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11d50 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11d60 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11d70 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11d80 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11d90 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11da0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11db0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11dc0 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11dd0 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11de0 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11df0 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11e00 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11e10 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11e20 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11e30 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11e40 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11e50 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11e60 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11e70 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11e80 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
11e90 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11ea0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11eb0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
11ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11ed0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11ee0 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
11ef0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11f00 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11f10 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
11f20 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11f30 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11f40 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
11f50 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
11f60 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11f70 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
11f80 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
11f90 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11fa0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
11fb0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
11fc0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
11fd0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
11fe0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11ff0 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12000 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12010 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12030 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12040 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12050 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12060 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12070 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12080 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12090 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
120a0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
120b0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
120c0 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
120d0 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
120e0 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
120f0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12100 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12110 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12120 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
12130 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12150 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12160 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12170 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12180 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12190 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
121a0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
121b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
121c0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
121d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
121e0 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
121f0 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12200 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12210 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12220 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12230 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12240 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12250 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12260 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12270 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12280 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12290 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
122a0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
122b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
122c0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
122d0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
122e0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
122f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12300 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12310 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12320 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12330 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12340 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12350 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12360 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12370 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12380 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12390 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
123a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
123b0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
123c0 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
123d0 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
123e0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
123f0 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12400 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12410 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12420 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12440 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12450 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
12460 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
12470 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12480 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12490 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
124a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
124b0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
124c0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
124d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
124e0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
124f0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12500 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12510 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12520 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12530 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12540 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12560 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12570 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
12580 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
12590 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125a0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125b0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125c0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125d0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
125e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
125f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12600 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12610 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12620 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12630 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12640 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12650 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12660 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12670 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
12680 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12690 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126a0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126c0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126d0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
126e0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
126f0 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12700 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12710 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12720 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12730 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12740 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12750 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12760 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12770 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12780 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
12790 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127a0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127b0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127c0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127d0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
127e0 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
127f0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12800 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12810 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12820 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12830 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12840 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12850 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12860 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12870 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
12880 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
12890 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128a0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128b0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128c0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
128e0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
128f0 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12900 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12910 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12920 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12930 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12940 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12950 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12960 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12970 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
12980 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
12990 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129b0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129d0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
129e0 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
129f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a10 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a20 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a30 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a40 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a50 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a60 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12a80 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12a90 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12aa0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ac0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12ad0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12ae0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12af0 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b00 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b10 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b30 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b40 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b50 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b60 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b70 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12b80 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12b90 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12ba0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12bc0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bd0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12be0 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12bf0 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c00 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c20 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c40 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c50 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c60 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c70 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12c80 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12c90 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12ca0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cb0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12cc0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cd0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12ce0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12cf0 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d00 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d10 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d40 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d50 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d60 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d70 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12d80 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12d90 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12db0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12dc0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12dd0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12de0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12df0 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e10 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e20 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e30 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e40 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e60 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e70 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e80 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12e90 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ea0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12eb0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ec0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ed0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12ee0 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12ef0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f00 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f10 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f20 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f30 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f40 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f50 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f60 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f70 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12f80 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12f90 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fa0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fb0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fc0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12fe0 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
12ff0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13000 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13010 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13020 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13030 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13040 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13050 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13070 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
13080 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
13090 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130a0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130c0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130d0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
130e0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
130f0 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13100 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13110 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13120 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13130 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13150 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13160 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13170 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
13180 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
13190 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131b0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131c0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131d0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
131e0 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
131f0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13200 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13210 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13220 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13230 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13240 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13250 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13260 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13270 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
13280 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
13290 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132a0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132d0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
132e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
132f0 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13300 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13310 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13330 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13340 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13350 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13360 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13370 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
13380 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
13390 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133a0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133b0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133c0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133d0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
133e0 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
133f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13400 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13410 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13420 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13430 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13440 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13450 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13460 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13470 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
13480 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
13490 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134c0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134d0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
134e0 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
134f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13500 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13510 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13520 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13530 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13540 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13550 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13560 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13570 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
13580 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
13590 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135a0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135b0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135d0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
135e0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
135f0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13600 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13610 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13620 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13630 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13640 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13650 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13660 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13670 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
13680 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
13690 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136a0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136c0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136d0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
136e0 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
136f0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13700 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13710 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13720 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13730 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13740 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13750 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13760 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13770 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
13780 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
13790 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137a0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137b0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137d0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
137e0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
137f0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13800 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13810 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13820 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13830 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13840 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13850 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13870 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13880 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
13890 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138a0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138b0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138c0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
138e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
138f0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13900 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13910 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13920 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13930 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13940 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13950 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13960 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13970 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13980 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
13990 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139c0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
139e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
139f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a00 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a10 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a30 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a60 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a70 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13a80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13a90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13ae0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13af0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b00 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13b10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13b20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13b30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b40 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b50 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13b60 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13b70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b90 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13ba0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13bc0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13bd0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13be0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13bf0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c10 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13c20 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13c30 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13c40 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13c50 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13c60 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13c70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13c80 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13c90 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13ca0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13cb0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13cc0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13cd0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13ce0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13cf0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13d00 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13d10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13d20 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13d30 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13d40 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13d50 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13d60 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13d70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13d80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13d90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13da0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13db0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13dc0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13dd0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13df0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13e00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e10 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13e30 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13e40 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13e50 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13e60 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
13e70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13e80 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13e90 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13ea0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13eb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13ec0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13ed0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13ee0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13ef0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13f00 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13f10 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13f20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13f30 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13f40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13f50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13f60 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13f70 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13f80 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13f90 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13fa0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13fb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13fc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13fe0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13ff0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
14000 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
14010 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
14020 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
14030 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
14040 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
14050 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
14060 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
14070 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
14080 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14090 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
140a0 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
140b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
140c0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
140d0 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
140e0 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
140f0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14100 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
14110 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14120 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
14130 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
14140 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
14150 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
14160 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
14170 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
14180 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14190 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
141a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
141b0 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
141c0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
141d0 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
141e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
141f0 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14200 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
14210 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
14220 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
14230 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14240 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
14250 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
14260 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
14270 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
14280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14290 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
142a0 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
142b0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
142c0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
142d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
142e0 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
142f0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
14300 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
14310 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
14320 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
14330 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
14340 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
14350 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
14360 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
14370 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
14380 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
14390 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
143a0 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
143b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
143c0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
143d0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
143e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
143f0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
14400 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
14410 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
14420 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14430 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
14440 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
14450 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
14460 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
14470 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
14480 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
14490 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
144a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
144b0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
144c0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
144d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
144e0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
144f0 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
14500 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
14510 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
14520 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
14530 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
14540 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
14550 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14560 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
14570 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
14580 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
14590 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
145a0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
145b0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
145c0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
145d0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
145e0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
145f0 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
14600 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
14610 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
14620 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14630 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
14640 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
14650 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
14660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
14670 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
14680 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
14690 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
146a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
146b0 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
146c0 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
146d0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
146e0 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
146f0 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
14700 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
14710 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
14720 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
14730 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
14740 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
14750 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
14760 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
14770 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
14780 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
14790 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
147a0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
147b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
147c0 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
147d0 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
147e0 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
147f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
14800 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
14810 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
14820 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14830 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
14840 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
14850 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
14860 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
14870 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14890 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
148a0 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
148b0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
148c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
148d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
148e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
148f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14900 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
14910 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
14920 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
14930 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14940 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14950 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14970 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14980 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14990 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
149a0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
149b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
149c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
149d0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
149e0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
149f0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  tion(pPager, 0, 
14a00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
14a10 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
14a20 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ger);.}../*.** P
14a30 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
14a40 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
14a50 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
14a60 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
14a70 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
14a80 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
14a90 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
14aa0 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
14ab0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
14ac0 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
14ad0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14ae0 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
14af0 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
14b00 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
14b10 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
14b20 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
14b30 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
14b40 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
14b50 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
14b60 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
14b70 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
14b80 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
14b90 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
14ba0 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
14bb0 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
14bc0 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
14bd0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14be0 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
14bf0 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
14c00 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
14c10 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
14c20 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
14c30 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
14c40 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
14c50 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
14c60 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
14c70 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
14c80 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
14c90 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
14ca0 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
14cb0 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
14cc0 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
14cd0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
14ce0 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
14cf0 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
14d00 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
14d10 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
14d20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
14d30 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
14d40 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
14d50 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
14d60 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
14d70 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
14d80 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
14d90 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
14da0 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
14db0 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
14dc0 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
14dd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
14de0 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
14df0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
14e00 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
14e10 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
14e20 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
14e30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
14e40 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
14e50 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
14e60 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
14e70 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
14e80 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14e90 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
14ea0 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
14eb0 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
14ec0 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
14ed0 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
14ee0 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
14ef0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
14f00 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
14f10 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
14f20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
14f30 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
14f40 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14f60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
14f70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14f80 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
14f90 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
14fa0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14fb0 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
14fc0 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
14fd0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
15000 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
15010 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
15020 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
15030 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
15040 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
15050 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
15060 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
15070 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
15080 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
15090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
150a0 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
150b0 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
150c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
150d0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
150e0 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
150f0 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
15100 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
15110 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
15120 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
15130 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
15140 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
15150 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
15160 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
15170 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
15180 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
15190 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
151a0 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
151b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
151c0 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
151d0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
151e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
151f0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15200 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15210 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15220 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
15230 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15240 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
15250 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
15260 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
15270 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
15280 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
15290 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
152a0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
152b0 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
152c0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
152d0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
152e0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
152f0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
15300 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
15310 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
15320 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
15330 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
15340 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
15350 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
15360 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
15370 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
15380 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
15390 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
153a0 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
153b0 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
153c0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
153d0 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
153e0 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
153f0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15410 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
15420 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
15430 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15440 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15450 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
15460 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
15470 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15480 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
15490 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
154a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
154b0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
154c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
154d0 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
154e0 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
154f0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
15500 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15510 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
15520 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
15530 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
15540 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
15550 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
15560 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
15570 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
15580 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
15590 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
155a0 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
155b0 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
155c0 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
155d0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
155e0 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
155f0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
15600 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
15610 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
15620 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
15630 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
15640 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
15650 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
15660 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
15670 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
15680 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
15690 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
156a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
156b0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
156c0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
156d0 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
156e0 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
156f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
15700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
15710 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
15720 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
15730 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
15740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
15750 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
15760 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
15770 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
15780 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
157b0 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
157c0 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
157d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
157e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
157f0 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
15800 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
15810 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
15820 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
15830 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
15840 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15850 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15870 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
15880 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
15890 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
158a0 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
158b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
158c0 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
158d0 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
158e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
158f0 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
15900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
15910 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
15920 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
15930 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15950 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
15960 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
15970 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
15980 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
15990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
159a0 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
159b0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
159c0 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
159f0 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
15a00 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
15a10 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
15a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
15a30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
15a40 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
15a50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
15a60 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
15a70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15a80 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
15a90 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
15aa0 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
15ab0 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
15ac0 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
15ad0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15ae0 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
15af0 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
15b00 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
15b10 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
15b20 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
15b30 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
15b40 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
15b50 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
15b60 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
15b70 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
15b80 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
15b90 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
15ba0 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
15bb0 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
15bc0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15bd0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
15be0 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
15bf0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
15c00 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
15c10 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
15c20 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
15c30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
15c40 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
15c50 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
15c60 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
15c70 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
15c80 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
15c90 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15ca0 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
15cb0 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
15cc0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
15cd0 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
15ce0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
15cf0 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
15d00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
15d10 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
15d20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15d30 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
15d40 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
15d50 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
15d60 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
15d70 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
15d80 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
15d90 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
15da0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
15db0 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
15dc0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
15dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15de0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15df0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
15e00 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
15e10 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
15e20 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
15e30 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15e40 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
15e50 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15e60 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15e70 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
15e80 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
15e90 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
15ea0 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
15eb0 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
15ec0 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
15ed0 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
15ee0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15ef0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
15f00 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
15f10 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
15f20 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
15f30 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
15f40 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
15f50 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
15f60 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
15f70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
15f80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15f90 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
15fa0 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
15fb0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
15fc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
15fd0 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
15fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15ff0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16000 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
16010 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
16020 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
16030 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
16040 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
16050 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
16060 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
16070 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
16080 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
16090 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
160a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
160b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
160c0 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
160d0 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
160e0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
160f0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
16100 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
16110 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
16120 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
16130 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
16140 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
16150 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
16160 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
16170 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
16180 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
16190 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
161a0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
161b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
161c0 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
161d0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
161e0 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
161f0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
16200 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
16210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16220 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
16230 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
16240 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
16250 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
16260 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
16270 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16280 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
16290 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
162a0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
162b0 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
162c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
162d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
162e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
162f0 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
16300 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
16310 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72  ed by before dur
16320 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
16330 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
16340 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
16350 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
16360 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
16370 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
16380 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
16390 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
163a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
163b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
163c0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
163d0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
163e0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
163f0 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
16400 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
16410 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
16420 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
16430 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
16440 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
16450 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
16460 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
16470 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
16480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16490 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
164a0 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
164b0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
164c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
164d0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
164e0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
164f0 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
16500 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
16510 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
16520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16530 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
16540 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
16550 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
16560 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
16570 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
16580 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
16590 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
165a0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
165b0 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
165c0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
165d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
165e0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
165f0 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
16600 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
16610 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
16620 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
16630 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
16640 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
16650 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
16660 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16670 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16680 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16690 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
166a0 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
166b0 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
166c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
166d0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
166e0 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
166f0 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16700 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
16710 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
16720 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
16730 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
16740 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
16750 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
16760 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16770 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16780 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16790 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
167a0 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
167b0 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
167c0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
167d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
167e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
167f0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16800 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
16810 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16820 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
16830 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
16840 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
16850 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
16860 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16870 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16880 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16890 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
168a0 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
168b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
168c0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
168d0 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
168e0 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
168f0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16900 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
16910 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
16920 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
16930 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
16940 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
16950 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
16960 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16970 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16980 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16990 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
169a0 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
169b0 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
169c0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
169d0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
169e0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
169f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16a00 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
16a10 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
16a20 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
16a30 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
16a40 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
16a50 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
16a60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16a70 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16a80 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16a90 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16aa0 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16ab0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16ac0 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16ad0 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16af0 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16b00 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
16b10 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
16b20 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
16b30 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16b40 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
16b50 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
16b60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16b70 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16b80 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16b90 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16ba0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16bb0 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16bc0 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16bd0 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16be0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
16bf0 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
16c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16c10 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
16c20 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
16c30 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
16c40 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
16c50 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
16c60 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
16c70 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
16c80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
16c90 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
16ca0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16cb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16cc0 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
16cd0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16ce0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
16cf0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
16d00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16d10 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
16d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16d30 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
16d40 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20  _OPEN || pPg==0 
16d50 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
16d60 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
16d70 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16d80 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
16d90 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
16da0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
16db0 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
16dc0 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
16dd0 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
16de0 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
16df0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
16e00 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
16e10 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
16e20 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
16e30 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
16e40 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
16e50 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
16e60 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
16e70 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
16e80 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
16e90 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
16ea0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
16eb0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
16ec0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
16ed0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
16ee0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16ef0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
16f00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
16f10 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
16f20 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
16f30 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
16f40 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16f50 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
16f60 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
16f70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
16f80 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
16f90 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
16fa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
16fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16fc0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
16fd0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
16fe0 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
16ff0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
17000 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
17010 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
17020 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17030 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17040 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
17050 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
17060 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
17070 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
17080 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
17090 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
170a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
170b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
170c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
170d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
170e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
170f0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
17100 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
17110 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
17120 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
17130 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
17140 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
17150 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
17160 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
17170 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17180 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
17190 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
171a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
171b0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
171c0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
171d0 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
171e0 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
171f0 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
17200 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
17210 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
17220 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
17230 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
17240 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17250 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
17260 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
17270 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
17280 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17290 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
172a0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
172b0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
172c0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
172d0 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
172e0 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
172f0 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
17300 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
17310 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
17320 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
17330 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
17340 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17350 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17360 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
17370 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
17380 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
17390 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
173a0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
173b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
173c0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
173d0 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
173e0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
173f0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
17400 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
17410 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17420 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
17430 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
17440 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
17450 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
17460 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
17470 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
17480 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
17490 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
174a0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
174b0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
174c0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
174d0 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
174e0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
174f0 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17500 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17510 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17520 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17530 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17540 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17550 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17560 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
17570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17580 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
17590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
175a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
175b0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
175c0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
175d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
175e0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
175f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17600 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17610 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17620 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17630 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17640 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17650 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17660 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
17670 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
17680 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
17690 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
176a0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
176b0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
176c0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
176d0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
176e0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
176f0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17700 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17710 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17720 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17730 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17740 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17750 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17760 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
17770 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
17780 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
17790 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
177a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
177b0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
177c0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
177d0 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
177e0 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
177f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17810 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17820 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17830 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17840 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17850 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17860 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
17870 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
17880 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17890 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
178a0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
178b0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
178c0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
178d0 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
178e0 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
178f0 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17900 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17910 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17920 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17930 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17940 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17950 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17960 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
17970 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
17980 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17990 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
179a0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
179b0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
179c0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
179d0 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
179e0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
179f0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17a00 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17a10 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17a20 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17a30 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17a40 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17a50 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17a60 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
17a70 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
17a80 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17a90 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17aa0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17ab0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17ac0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17ad0 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17ae0 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17af0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17b00 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17b10 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17b20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17b30 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17b40 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17b50 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17b60 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
17b70 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
17b80 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17b90 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17ba0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17bb0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17bc0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17bd0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17be0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17bf0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17c10 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17c20 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17c30 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17c40 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17c50 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17c60 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17c70 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
17c80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17c90 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17ca0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17cb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17cc0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17cd0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17ce0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17cf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17d00 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17d10 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17d20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17d30 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17d40 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17d50 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17d60 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
17d70 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
17d80 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17d90 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
17da0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
17db0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17dc0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17dd0 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17de0 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17df0 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17e00 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17e10 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17e20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
17e30 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
17e40 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
17e50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
17e60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
17e70 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
17e80 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
17e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17ea0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
17eb0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
17ec0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17ed0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17ee0 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17ef0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17f00 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17f10 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17f20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17f30 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17f50 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17f60 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17f70 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17f80 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17f90 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17fa0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17fb0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17fc0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17fe0 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17ff0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18000 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
18010 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
18020 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
18030 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
18040 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
18050 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
18060 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
18070 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
18080 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
18090 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
180a0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
180b0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
180c0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
180d0 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
180e0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
180f0 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
18100 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
18110 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
18120 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
18130 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
18140 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
18150 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
18160 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
18170 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
18180 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
18190 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
181a0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
181b0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
181c0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
181d0 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
181e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
181f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18200 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
18210 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
18220 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
18230 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
18240 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
18250 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
18260 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
18270 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
18280 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
18290 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
182a0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
182b0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
182c0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
182d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
182e0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
182f0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18300 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
18310 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
18320 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
18330 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
18340 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
18350 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
18360 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
18370 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
18380 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
18390 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
183a0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
183b0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
183c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
183d0 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
183e0 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
183f0 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
18400 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
18410 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
18420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
18430 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
18440 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
18450 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18460 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
18470 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
18480 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
18490 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
184a0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
184b0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
184c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
184d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
184e0 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
184f0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18500 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18510 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18520 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18530 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18540 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18550 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18560 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
18570 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18580 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18590 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
185a0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
185b0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
185c0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
185d0 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
185e0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
185f0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18600 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18610 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18630 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18640 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18650 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18660 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18670 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18680 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
18690 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
186a0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
186b0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
186c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
186d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
186e0 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
186f0 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18700 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18710 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18720 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18730 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18740 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18750 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18760 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
18770 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
18780 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
18790 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
187a0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
187b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
187c0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
187d0 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
187e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
187f0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18800 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18810 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18820 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18830 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18840 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18850 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18860 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
18870 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
18880 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18890 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
188a0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
188b0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
188c0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
188d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
188e0 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
188f0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18900 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18910 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18920 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18930 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18940 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18950 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18960 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
18970 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
18980 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18990 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
189a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
189b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
189c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
189d0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
189e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
189f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18a00 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18a20 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18a30 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18a40 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18a60 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18a70 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
18a80 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18aa0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18ab0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18ac0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18ad0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18ae0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18af0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18b00 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18b10 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18b20 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18b30 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18b40 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18b50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18b60 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
18b70 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
18b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18b90 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18ba0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18bb0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18bc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18bd0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18be0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18bf0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18c00 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18c10 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18c20 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18c30 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18c40 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18c50 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
18c60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18c70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
18c80 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c90 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18ca0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18cb0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18cc0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18cd0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18ce0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18cf0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18d00 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d20 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18d30 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
18d40 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18d50 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
18d60 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
18d70 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
18d80 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
18d90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
18da0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18db0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
18dc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18dd0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18de0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18df0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18e00 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
18e30 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18e40 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
18e50 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
18e60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
18e70 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
18e80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18e90 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
18ea0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
18eb0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
18ec0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18ed0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18ee0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18ef0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18f00 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18f10 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18f20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
18f30 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
18f40 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18f50 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18f60 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18f70 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18f80 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18f90 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18fa0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18fd0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18fe0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18ff0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19000 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19010 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19020 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19040 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19050 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19070 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19080 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19090 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
190a0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
190b0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
190c0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
190d0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
190e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
190f0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19100 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19130 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19150 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19160 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19170 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19180 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19190 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
191a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
191b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
191c0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
191d0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
191e0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
191f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19200 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19210 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19220 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19230 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19240 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19250 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19260 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19270 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19280 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19290 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
192a0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
192b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
192c0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
192d0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
192e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
192f0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19300 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19310 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19330 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19340 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19350 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19360 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19370 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19380 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19390 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
193a0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
193b0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
193c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
193d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
193e0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
193f0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19400 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19410 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19420 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19430 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19440 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19450 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19460 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19470 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19480 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19490 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
194a0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
194b0 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
194c0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
194d0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
194e0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
194f0 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19500 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19510 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19520 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19530 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19540 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19550 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19560 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
19570 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
19580 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
19590 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
195a0 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
195b0 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
195c0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
195d0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
195e0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
195f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19610 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19620 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19630 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19640 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19650 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19660 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
19670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19680 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19690 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
196a0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
196b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
196c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
196d0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
196e0 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
196f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19700 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19710 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19720 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19730 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19740 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19750 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
19770 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
19780 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19790 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
197a0 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
197b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
197c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
197d0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
197e0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
197f0 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19800 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19810 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19820 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19830 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19840 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19850 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19860 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
19870 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19890 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
198a0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
198b0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
198c0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
198d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
198e0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
198f0 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19900 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19910 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19920 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19930 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19940 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19950 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19960 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
19970 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
19980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19990 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
199a0 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
199b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
199c0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
199d0 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
199e0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
199f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19a00 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19a10 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19a20 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19a50 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19a60 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
19a70 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
19a80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19aa0 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19ab0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19ac0 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19ad0 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19ae0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19af0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19b00 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19b10 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19b20 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
19b30 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
19b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19b50 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
19b60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19b70 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
19b80 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19b90 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
19ba0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
19bb0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19bc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19bd0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19be0 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
19bf0 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
19c00 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
19c10 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
19c20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
19c30 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
19c40 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
19c50 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
19c60 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
19c70 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19c80 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
19c90 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
19ca0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
19cb0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
19cc0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19cd0 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19ce0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19cf0 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19d00 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19d10 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19d20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
19d30 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
19d40 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
19d50 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
19d60 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
19d70 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19d80 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
19d90 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
19da0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
19db0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
19dc0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
19dd0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19de0 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
19df0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
19e00 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
19e10 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
19e20 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
19e30 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
19e40 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
19e50 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
19e60 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
19e70 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
19e80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
19e90 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19ea0 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
19eb0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
19ec0 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
19ed0 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
19ee0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19ef0 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
19f00 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
19f10 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
19f20 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
19f30 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
19f40 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
19f50 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
19f60 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
19f70 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
19f80 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
19f90 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
19fa0 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
19fb0 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
19fc0 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
19fd0 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
19fe0 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
19ff0 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a000 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a010 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a020 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a030 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a040 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a050 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a060 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a080 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a090 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a0a0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a0b0 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1a0c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1a0d0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1a0e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1a0f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1a100 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1a110 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1a130 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1a140 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a150 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a160 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1a170 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1a180 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a190 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1a1a0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1a1b0 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1a1c0 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1a1d0 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1a1e0 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1a1f0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1a200 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1a210 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1a220 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1a230 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1a240 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1a250 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a260 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1a270 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1a280 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1a290 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a2a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a2b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1a2c0 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1a2d0 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1a2e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a2f0 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1a300 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1a310 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1a320 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1a330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1a340 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1a350 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1a360 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1a370 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1a380 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1a390 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1a3a0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a3b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a3c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a3d0 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1a3e0 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1a3f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1a400 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1a410 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1a420 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1a430 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1a440 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1a450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1a460 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1a470 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a480 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a490 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1a4a0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1a4b0 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1a4c0 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1a4d0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1a4e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a4f0 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1a500 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1a510 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1a520 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1a530 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1a540 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a550 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a560 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1a570 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1a580 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1a590 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1a5a0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1a5b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a5c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1a5d0 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1a5e0 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1a5f0 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1a600 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1a610 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1a620 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1a630 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1a640 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1a650 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1a660 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1a670 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1a680 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1a690 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1a6a0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1a6b0 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1a6c0 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1a6d0 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1a6e0 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1a6f0 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1a700 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1a710 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1a720 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1a730 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1a740 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1a750 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1a760 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1a770 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1a780 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1a790 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a7a0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1a7b0 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1a7c0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a7d0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1a7e0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1a7f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a800 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1a810 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1a820 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1a830 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1a840 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1a850 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1a860 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1a870 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a880 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1a890 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1a8a0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1a8b0 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1a8c0 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1a8d0 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1a8e0 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1a8f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1a900 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1a910 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1a920 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1a930 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1a940 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1a950 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1a960 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1a970 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1a980 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1a990 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1a9a0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1a9b0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1a9c0 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1a9d0 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1a9e0 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1a9f0 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1aa00 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1aa10 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1aa20 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1aa30 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1aa40 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1aa50 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1aa60 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1aa70 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1aa80 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1aa90 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1aaa0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1aab0 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1aac0 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1aad0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1aae0 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1aaf0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1ab00 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1ab10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ab20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1ab30 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1ab40 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1ab50 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1ab60 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1ab70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ab80 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1ab90 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1aba0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1abb0 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1abc0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1abd0 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1abe0 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1abf0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1ac00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1ac10 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1ac20 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1ac30 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1ac40 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1ac50 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1ac60 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1ac70 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1ac80 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1ac90 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1aca0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1acb0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1acc0 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1acd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1ace0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1acf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1ad00 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1ad10 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1ad20 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1ad30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1ad40 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1ad50 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1ad60 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1ad70 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1ad80 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1ad90 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1ada0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1adb0 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1adc0 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1add0 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1ade0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1adf0 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1ae00 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1ae10 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1ae20 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1ae30 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1ae40 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1ae50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1ae60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ae70 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1ae80 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1ae90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1aea0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1aeb0 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1aec0 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1aed0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1aee0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1aef0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1af00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1af10 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1af20 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1af30 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1af40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1af60 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1af70 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1af80 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1af90 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1afa0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1afb0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1afc0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1afd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1afe0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1aff0 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b000 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b010 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b020 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b030 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b040 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1b050 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1b060 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1b070 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b080 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1b090 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1b0a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b0b0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b0c0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b0d0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b0e0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b0f0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b100 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b110 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b120 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b130 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b140 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b150 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b160 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b170 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b180 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1b190 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b1a0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1b1b0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1b1c0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1b1d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b1e0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1b1f0 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1b200 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1b210 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1b220 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1b230 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1b240 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1b250 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1b260 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1b270 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1b280 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1b290 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1b2a0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1b2b0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1b2c0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1b2d0 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1b2e0 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1b2f0 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1b300 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1b310 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1b320 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b330 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1b340 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1b350 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1b360 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1b370 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1b380 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1b390 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1b3a0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1b3b0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1b3c0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1b3d0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1b3e0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1b3f0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1b400 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1b410 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1b420 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1b430 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1b440 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1b450 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1b460 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1b470 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1b480 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1b490 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1b4a0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1b4b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b4c0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1b4d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b4e0 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1b4f0 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1b500 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1b510 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1b520 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1b530 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1b540 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1b550 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1b560 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1b570 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1b580 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1b590 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1b5a0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1b5b0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1b5c0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b5d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b5e0 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b5f0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b600 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b620 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b630 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b640 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b650 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b660 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b670 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b680 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b690 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b6a0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b6b0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b6c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b6d0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b6e0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b6f0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b700 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b730 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b750 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b760 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b770 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b780 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b790 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b7a0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b7b0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b7c0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b7d0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1b7e0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1b7f0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1b800 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1b810 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1b820 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1b830 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1b840 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1b850 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1b860 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1b870 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1b880 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1b890 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1b8a0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1b8b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b8c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b8d0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b8e0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1b8f0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b900 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1b910 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1b920 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b930 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b940 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1b950 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1b960 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1b970 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1b980 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b990 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b9a0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b9b0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b9c0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b9d0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b9e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b9f0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1ba00 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1ba10 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1ba20 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1ba30 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1ba40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1ba50 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1ba60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1ba70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1ba80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ba90 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1baa0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1bab0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1bac0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1bad0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1bae0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1baf0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1bb00 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1bb10 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1bb20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1bb30 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1bb40 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1bb50 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1bb60 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1bb70 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1bb80 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1bb90 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1bba0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1bbb0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1bbc0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1bbd0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1bbe0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1bbf0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1bc00 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1bc10 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1bc20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1bc30 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1bc40 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1bc50 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1bc60 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1bc70 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bc80 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1bc90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bca0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1bcb0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1bcc0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1bcd0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1bce0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bcf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bd00 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1bd10 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bd20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bd30 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1bd40 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1bd50 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bd60 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1bd70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bd80 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1bd90 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1bda0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1bdb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bdc0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bdd0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1bde0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1bdf0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1be00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1be10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1be20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1be30 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1be40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1be50 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1be60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1be70 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1be80 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1be90 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1bea0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1beb0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1bec0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1bed0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1bee0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1bef0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1bf00 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1bf10 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1bf20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1bf30 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1bf40 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1bf50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1bf60 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1bf70 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1bf80 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1bf90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1bfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfb0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1bfc0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1bfd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1bfe0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1bff0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c000 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c010 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c020 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c030 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c040 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c050 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c060 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c070 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c080 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c090 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c0a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c0b0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1c0c0 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1c0d0 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1c0e0 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1c0f0 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1c100 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1c110 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1c120 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1c130 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1c140 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1c150 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1c160 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1c170 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1c180 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1c190 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1c1a0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1c1b0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1c1c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c1d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c1e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c1f0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1c200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c210 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1c220 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1c230 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1c240 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1c250 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1c260 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1c270 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1c280 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1c290 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1c2a0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1c2b0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1c2c0 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1c2d0 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1c2e0 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1c2f0 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1c300 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1c310 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1c320 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1c330 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c340 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c360 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1c370 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1c380 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1c390 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1c3a0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1c3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c3c0 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1c3d0 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1c3e0 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1c3f0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1c400 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c410 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1c420 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1c430 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1c440 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1c450 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1c460 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1c470 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1c480 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1c490 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1c4a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c4b0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1c4c0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c4d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1c4e0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1c4f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1c500 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1c510 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1c520 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1c530 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1c540 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1c550 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1c560 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1c570 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1c580 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1c590 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1c5a0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1c5b0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1c5c0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1c5d0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1c5e0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1c5f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1c600 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1c610 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1c620 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1c630 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1c640 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1c650 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1c660 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1c670 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1c680 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1c690 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1c6a0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1c6b0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1c6c0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1c6d0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1c6e0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1c6f0 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1c700 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1c710 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1c720 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1c730 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1c740 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1c750 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1c760 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1c770 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1c780 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1c790 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c7a0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1c7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1c7c0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1c7d0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1c7e0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1c7f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1c800 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1c810 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1c820 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1c830 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c840 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c860 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1c870 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1c880 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1c890 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1c8a0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1c8b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c8c0 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 29  agerSync(pPager)
1c8d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1c8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c8f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1c900 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1c910 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1c920 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1c930 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c940 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c960 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1c970 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1c980 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1c990 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1c9a0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1c9b0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1c9c0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1c9d0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1c9e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1c9f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1ca00 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1ca10 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1ca20 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1ca30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1ca40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1ca50 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1ca60 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1ca70 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1ca80 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1ca90 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1caa0 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1cab0 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1cad0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1cae0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1caf0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1cb00 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1cb10 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1cb20 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1cb30 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1cb40 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1cb50 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1cb60 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1cb70 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1cb80 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1cb90 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1cba0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1cbb0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1cbc0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1cbd0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1cbe0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1cbf0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1cc00 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1cc10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cc20 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1cc30 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1cc40 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1cc50 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1cc60 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1cc70 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1cc80 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1cc90 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1cca0 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1ccb0 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1ccc0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1ccd0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1cce0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1ccf0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1cd00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1cd10 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1cd20 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1cd30 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1cd40 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1cd50 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1cd60 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1cd70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1cd80 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1cd90 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1cda0 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1cdb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1cdc0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1cdd0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1cde0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1cdf0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1ce00 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1ce10 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1ce20 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1ce30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1ce40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1ce50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ce60 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1ce70 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1ce80 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1ce90 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1cea0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1ceb0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1cec0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1ced0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1cee0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1cef0 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1cf00 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1cf10 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1cf20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cf30 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1cf40 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1cf50 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1cf60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1cf70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cf80 20 7d 0a 0a 20 20 69 66 28 20 69 46 72 61 6d 65   }..  if( iFrame
1cf90 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74   ){.    /* Try t
1cfa0 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20  o pull the page 
1cfb0 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61  from the write-a
1cfc0 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20  head log. */.   
1cfd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1cfe0 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72  ReadFrame(pPager
1cff0 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20  ->pWal, iFrame, 
1d000 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1d010 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d020 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70  i64 iOffset = (p
1d030 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1d040 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1d050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d060 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
1d070 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73   pPg->pData, pgs
1d080 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  z, iOffset);.   
1d090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d0a0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1d0b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1d0c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1d0d0 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d    }..  if( pgno=
1d0e0 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =1 ){.    if( rc
1d0f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1d100 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75  the read is unsu
1d110 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1d120 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74  e dbFileVers[] t
1d130 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20  o something.    
1d140 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e    ** that will n
1d150 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20  ever be a valid 
1d160 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64  file version.  d
1d170 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61  bFileVers[] is a
1d180 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f   copy.      ** o
1d190 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f  f bytes 24..39 o
1d1a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1d1b0 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68   Bytes 28..31 sh
1d1c0 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20  ould always be. 
1d1d0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20       ** zero or 
1d1e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1d1f0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
1d200 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61  . Bytes 32..35 a
1d210 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20  nd 35..39.      
1d220 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67  ** should be pag
1d230 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  e numbers which 
1d240 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66  are never 0xffff
1d250 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e  ffff.  So fillin
1d260 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65  g.      ** pPage
1d270 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  r->dbFileVers[] 
1d280 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79  with all 0xff by
1d290 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69  tes should suffi
1d2a0 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ce..      **.   
1d2b0 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63     ** For an enc
1d2c0 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c  rypted database,
1d2d0 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69   the situation i
1d2e0 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20  s more complex: 
1d2f0 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20   bytes.      ** 
1d300 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
1d310 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65  tabase are white
1d320 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65   noise.  But the
1d330 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a   probability of.
1d340 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e        ** white n
1d350 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20  oising equaling 
1d360 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
1d370 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
1d380 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
1d390 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
1d3a0 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
1d3b0 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
1d3c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d3d0 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
1d3e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d3f0 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
1d400 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
1d410 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
1d420 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
1d430 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1d440 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d450 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1d460 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1d470 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1d480 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1d490 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
1d4a0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
1d4b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
1d4c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1d4d0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1d4e0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
1d4f0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1d500 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
1d510 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
1d520 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1d530 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
1d540 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1d550 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1d560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d570 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1d580 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1d590 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
1d5a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d5b0 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1d5c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61  value of the cha
1d5d0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f  nge-counter at o
1d5e0 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32  ffsets 24 and 92
1d5f0 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   in.** the heade
1d600 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  r and the sqlite
1d610 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1d620 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
1d630 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75  .** This is an u
1d640 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64  nconditional upd
1d650 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74  ate.  See also t
1d660 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  he pager_incr_ch
1d670 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a  angecounter().**
1d680 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f   routine which o
1d690 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  nly updates the 
1d6a0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
1d6b0 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20  f the update is 
1d6c0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64  actually.** need
1d6d0 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65  ed, as determine
1d6e0 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d  d by the pPager-
1d6f0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1d700 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e   state variable.
1d710 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d720 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1d730 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20  gecounter(PgHdr 
1d740 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61  *pPg){.  u32 cha
1d750 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20  nge_counter;..  
1d760 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1d770 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1d780 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1d790 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1d7a0 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1d7b0 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
1d7c0 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70  byte((u8*)pPg->p
1d7d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d7e0 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74  s)+1;.  put32bit
1d7f0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1d800 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
1d810 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a  _counter);..  /*
1d820 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20   Also store the 
1d830 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
1d840 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39  umber in bytes 9
1d850 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a  6..99 and in.  *
1d860 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73  * bytes 92..95 s
1d870 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20  tore the change 
1d880 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63  counter for whic
1d890 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  h the version nu
1d8a0 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c  mber.  ** is val
1d8b0 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  id. */.  put32bi
1d8c0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1d8d0 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67  pData)+92, chang
1d8e0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75  e_counter);.  pu
1d8f0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1d900 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  pPg->pData)+96, 
1d910 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1d920 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64  UMBER);.}..#ifnd
1d930 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1d940 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1d950 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1d960 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1d970 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1d980 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1d990 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1d9a0 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1d9b0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1d9c0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1d9d0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1d9e0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1d9f0 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1da00 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1da10 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1da20 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1da30 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1da40 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1da50 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1da60 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1da70 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1da80 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1da90 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1daa0 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1dab0 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1dac0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1dad0 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1dae0 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1daf0 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1db00 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1db10 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1db20 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1db30 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1db40 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1db50 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1db60 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1db70 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1db80 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1db90 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1dba0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1dbb0 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1dbc0 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1dbd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1dbe0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1dbf0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1dc00 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1dc10 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
1dc20 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1dc30 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d  ager) );.  pPg =
1dc40 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1dc50 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1dc60 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1dc70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1dc80 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1dc90 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1dca0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1dcb0 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1dcc0 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69  lse{.      u32 i
1dcd0 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  Frame = 0;.     
1dce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1dcf0 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
1dd00 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ->pWal, pPg->pgn
1dd10 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
1dd20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1dd30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1dd40 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1dd50 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20  pPg, iFrame);.  
1dd60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1dd70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dd80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1dd90 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1dda0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1ddb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1ddc0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1ddd0 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1dde0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1ddf0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1de00 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1de10 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1de20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1de30 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1de40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1de50 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1de60 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1de70 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1de80 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1de90 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1dea0 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1deb0 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1dec0 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1ded0 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1dee0 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1def0 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1df00 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1df10 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1df20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1df30 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1df40 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1df50 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1df60 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1df70 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1df80 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1df90 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1dfa0 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1dfb0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1dfc0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1dfd0 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1dfe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1dff0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e000 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1e010 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1e020 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1e030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e040 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e060 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1e090 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1e0a0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1e0b0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e0c0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1e0d0 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1e0e0 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1e0f0 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1e100 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1e110 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1e120 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1e130 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1e140 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1e150 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1e160 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1e170 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1e180 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1e190 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1e1a0 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1e1b0 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1e1c0 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1e1d0 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e1e0 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1e1f0 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1e200 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1e210 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1e220 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e230 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1e240 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1e250 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1e260 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1e270 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1e280 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1e290 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1e2a0 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1e2b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e2c0 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1e2d0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1e2e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1e2f0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1e300 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1e310 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1e320 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1e330 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e340 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1e350 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1e360 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1e370 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1e380 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1e390 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1e3a0 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1e3b0 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1e3c0 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1e3d0 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1e3e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1e3f0 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1e400 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1e410 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1e420 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1e430 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1e440 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1e450 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1e460 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1e470 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1e480 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1e490 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1e4a0 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1e4b0 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1e4c0 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1e4d0 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1e4e0 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1e4f0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1e500 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1e510 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1e520 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1e530 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1e540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e550 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1e560 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1e570 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1e580 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e590 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1e5a0 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1e5b0 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e5e0 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1e5f0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e620 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1e630 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e650 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1e660 69 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ist */.#if defin
1e670 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1e680 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e690 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a  TE_CHECK_PAGES).
1e6a0 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1e6d0 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23   over pages */.#
1e6e0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1e6f0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1e700 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1e710 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1e720 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1e730 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1e740 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1e750 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1e760 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e770 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1e780 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1e790 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1e7a0 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1e7b0 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1e7c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1e7d0 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1e7e0 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1e7f0 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1e800 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1e810 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1e820 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1e830 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1e840 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1e850 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1e860 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1e870 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1e880 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1e890 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1e8a0 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1e8b0 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1e8c0 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1e8d0 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1e8e0 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1e8f0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1e900 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64  Hdr *p;.    PgHd
1e910 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c  r **ppNext = &pL
1e920 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  ist;.    nList =
1e930 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   0;.    for(p=pL
1e940 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20  ist; (*ppNext = 
1e950 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72  p)!=0; p=p->pDir
1e960 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ty){.      if( p
1e970 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74  ->pgno<=nTruncat
1e980 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70 4e  e ){.        ppN
1e990 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74 79  ext = &p->pDirty
1e9a0 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74 2b  ;.        nList+
1e9b0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1e9c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1e9d0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1e9e0 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20     nList = 1;.  
1e9f0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61  }.  pPager->aSta
1ea00 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
1ea10 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20  TE] += nList;.. 
1ea20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
1ea30 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
1ea40 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
1ea50 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  pList);.  rc = s
1ea60 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1ea70 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20  pPager->pWal, . 
1ea80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
1ea90 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54  eSize, pList, nT
1eaa0 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69  runcate, isCommi
1eab0 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t, pPager->walSy
1eac0 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  ncFlags.  );.  i
1ead0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1eae0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
1eaf0 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72  kup ){.    PgHdr
1eb00 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
1eb10 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1eb20 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c  irty){.      sql
1eb30 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
1eb40 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1eb50 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a  , p->pgno, (u8 *
1eb60 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  )p->pData);.    
1eb70 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
1eb80 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1eb90 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1eba0 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1ebb0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1ebc0 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  e);.  for(p=pLis
1ebd0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1ebe0 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  y){.    pager_se
1ebf0 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20  t_pagehash(p);. 
1ec00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
1ec10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ec20 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
1ec30 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1ec40 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
1ec50 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
1ec60 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
1ec70 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
1ec80 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
1ec90 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
1eca0 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
1ecb0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
1ecc0 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
1ecd0 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
1ece0 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
1ecf0 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
1ed00 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
1ed10 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
1ed20 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
1ed30 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
1ed40 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
1ed50 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
1ed60 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
1ed70 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
1ed80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1ed90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1edb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1edc0 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
1edd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ede0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
1edf0 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
1ee00 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
1ee10 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1ee20 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
1ee30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1ee40 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
1ee50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1ee60 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a  AGER_READER );..
1ee70 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45    /* sqlite3WalE
1ee80 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1ee90 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  n() was not call
1eea0 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ed for the previ
1eeb0 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ous.  ** transac
1eec0 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  tion in locking_
1eed0 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20  mode=EXCLUSIVE. 
1eee0 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e   So call it now.
1eef0 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65    If we.  ** are
1ef00 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1ef10 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52  =NORMAL and EndR
1ef20 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f  ead() was previo
1ef30 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a  usly called,.  *
1ef40 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  * the duplicate 
1ef50 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73  call is harmless
1ef60 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ef70 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1ef80 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1ef90 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  al);..  rc = sql
1efa0 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64  ite3WalBeginRead
1efb0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1efc0 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67  er->pWal, &chang
1efd0 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ed);.  if( rc!=S
1efe0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e  QLITE_OK || chan
1eff0 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ged ){.    pager
1f000 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1f010 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
1f020 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74  (pPager) ) sqlit
1f030 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
1f040 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
1f050 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f060 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f080 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1f090 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
1f0a0 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
1f0b0 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
1f0c0 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
1f0d0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1f0e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f0f0 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
1f100 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
1f110 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
1f120 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
1f130 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
1f140 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
1f150 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
1f160 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1f170 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1f180 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1f190 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
1f1a0 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
1f1b0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
1f1c0 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
1f1d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
1f1e0 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
1f1f0 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
1f200 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
1f210 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f220 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
1f230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f240 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
1f250 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f270 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1f280 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
1f290 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
1f2a0 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f2b0 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
1f2c0 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
1f2d0 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
1f2e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
1f2f0 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
1f300 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
1f310 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
1f320 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
1f330 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1f340 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
1f350 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1f360 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
1f370 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f380 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
1f390 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
1f3a0 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
1f3b0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
1f3c0 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
1f3d0 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
1f3e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f3f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f400 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
1f410 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
1f420 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1f430 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1f440 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1f450 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1f460 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f470 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61  size was not ava
1f480 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1f490 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a  WAL sub-system,.
1f4a0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69    ** determine i
1f4b0 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
1f4c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f4d0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1f4e0 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68   size.  ** of th
1f4f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f500 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
1f510 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1f520 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a  e page-size,.  *
1f530 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20  * round down to 
1f540 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65  the nearest page
1f550 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69  . Except, any fi
1f560 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30  le larger than 0
1f570 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
1f580 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
1f590 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20  d to contain at 
1f5a0 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a  least one page..
1f5b0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1f5c0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  ==0 ){.    i64 n
1f5d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f5f0 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62   of db file in b
1f600 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  ytes */.    asse
1f610 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1f620 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1f630 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1f640 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1f650 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1f660 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1f670 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1f680 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20  ger->fd, &n);.  
1f690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f6b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f6c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50    }.    }.    nP
1f6d0 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1f6e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f6f0 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1f700 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1f710 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1f720 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1f730 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1f740 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1f750 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1f760 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1f770 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1f780 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1f790 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1f7a0 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1f7b0 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1f7c0 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1f7d0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1f7e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1f7f0 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1f800 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1f810 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1f820 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1f830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1f840 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1f850 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f860 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1f870 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f880 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1f890 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
1f8a0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1f8b0 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
1f8c0 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
1f8d0 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
1f8e0 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
1f8f0 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
1f900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f910 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
1f920 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1f930 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
1f940 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
1f950 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
1f960 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
1f970 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
1f980 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
1f990 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
1f9a0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
1f9b0 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
1f9c0 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
1f9d0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
1f9e0 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
1f9f0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
1fa00 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
1fa10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1fa20 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1fa30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
1fa40 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
1fa50 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
1fa60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fa70 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
1fa80 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
1fa90 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
1faa0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
1fab0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
1fac0 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
1fad0 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
1fae0 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
1faf0 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
1fb00 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
1fb10 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
1fb20 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
1fb30 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
1fb40 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
1fb50 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
1fb60 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
1fb70 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1fb80 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
1fb90 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
1fba0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1fbb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fbc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fbd0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1fbe0 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
1fbf0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
1fc00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
1fc10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
1fc20 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
1fc30 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fc50 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
1fc60 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
1fc70 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1fc90 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1fca0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
1fcb0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
1fcc0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1fcd0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1fce0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fcf0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1fd00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1fd10 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
1fd20 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
1fd30 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
1fd40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fd50 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
1fd60 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
1fd70 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
1fd80 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
1fd90 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1fda0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
1fdb0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1fdc0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
1fdd0 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
1fde0 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
1fdf0 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
1fe00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1fe10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fe20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
1fe30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1fe40 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1fe50 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
1fe60 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
1fe70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fe80 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
1fe90 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
1fea0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1feb0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1fec0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1fed0 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
1fee0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1fef0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
1ff00 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
1ff10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ff20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ff30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
1ff40 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
1ff50 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
1ff60 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
1ff70 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
1ff80 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
1ff90 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
1ffa0 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
1ffb0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
1ffc0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
1ffd0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
1ffe0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
1fff0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
20000 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
20010 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
20020 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
20030 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
20040 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
20050 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
20060 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
20070 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
20080 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
20090 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
200a0 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
200b0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
200c0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
200d0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
200e0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
200f0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
20100 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20110 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20120 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
20130 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
20140 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20150 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
20160 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
20170 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
20180 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
20190 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
201a0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
201b0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
201c0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
201d0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
201e0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
201f0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
20200 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
20210 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
20220 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
20230 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
20240 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
20250 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
20260 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
20270 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20280 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
20290 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
202a0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
202b0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
202c0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
202d0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
202e0 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
202f0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20300 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20310 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20320 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20330 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
20340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20350 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
20360 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
20370 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
20380 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
20390 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
203a0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
203b0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
203c0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
203d0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
203e0 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
203f0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20400 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20410 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20420 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20430 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
20440 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
20450 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
20460 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
20470 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
20480 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
20490 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
204a0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
204b0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
204c0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
204d0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
204e0 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
204f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
20500 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
20510 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
20520 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
20530 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
20540 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
20550 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
20560 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
20570 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
20580 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
20590 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
205a0 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
205b0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
205c0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
205d0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
205e0 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
205f0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
20600 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
20610 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20620 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20630 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
20640 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
20650 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
20660 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
20670 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
20680 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
20690 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
206a0 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
206b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
206c0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
206d0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
206e0 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
206f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20700 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
20710 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20720 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20730 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
20740 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20750 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20760 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
20770 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20780 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
20790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
207a0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
207b0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
207c0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
207d0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
207e0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
207f0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
20800 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
20810 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20820 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20830 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20840 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20850 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20860 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20870 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20880 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20890 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
208a0 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
208b0 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
208c0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
208d0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
208e0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
208f0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
20900 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
20910 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
20920 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
20930 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
20940 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  ;.  pPager->chan
20950 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
20960 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
20970 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69  .  if( !pSavepoi
20980 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61  nt && pagerUseWa
20990 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
209a0 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c   return pagerRol
209b0 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29  lbackWal(pPager)
209c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20  ;.  }..  /* Use 
209d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
209e0 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
209f0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20a00 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
20a10 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
20a20 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
20a30 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
20a40 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
20a50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20a60 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
20a70 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
20a80 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
20a90 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
20aa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20ab0 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
20ac0 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
20ad0 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
20ae0 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72  rnalOff;.  asser
20af0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
20b00 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a  Pager)==0 || szJ
20b10 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  ==0 );..  /* Beg
20b20 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
20b30 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
20b40 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20b50 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
20b60 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
20b70 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20b80 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
20b90 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
20ba0 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
20bb0 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
20bc0 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
20bd0 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
20be0 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
20bf0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
20c00 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
20c10 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
20c20 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
20c30 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
20c40 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
20c50 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
20c60 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
20c70 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
20c80 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
20c90 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
20ca0 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73  oint && !pagerUs
20cb0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20cc0 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
20cd0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
20ce0 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
20cf0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
20d00 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
20d10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
20d20 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
20d30 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
20d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20d50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20d60 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
20d70 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20d80 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
20d90 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
20da0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f  >journalOff, pDo
20db0 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 1, 1);.    }
20dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
20dd0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
20de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
20df0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20e00 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
20e10 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
20e20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
20e30 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20e40 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
20e50 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
20e60 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
20e70 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
20e80 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
20e90 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
20ea0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20eb0 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
20ec0 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
20ed0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
20ee0 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
20ef0 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
20f00 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
20f10 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
20f20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20f30 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20f40 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
20f50 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
20f60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20f70 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
20f80 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
20f90 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
20fa0 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
20fb0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
20fc0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
20fd0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
20fe0 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
20ff0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
21000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21010 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
21020 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
21030 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
21040 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
21050 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
21060 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
21070 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
21080 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
21090 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
210a0 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
210b0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
210c0 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
210d0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
210e0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
210f0 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
21100 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
21110 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
21120 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
21130 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
21140 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
21150 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
21160 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
21170 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
21180 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
21190 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
211a0 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
211b0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
211c0 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
211d0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
211e0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
211f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
21200 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
21210 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
21220 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31  Off, pDone, 1, 1
21230 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
21240 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21250 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
21260 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21270 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
21280 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29  ournalOff>=szJ )
21290 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
212a0 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
212b0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
212c0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
212d0 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
212e0 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
212f0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
21300 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
21310 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
21320 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
21330 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
21340 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
21350 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
21360 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
21370 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
21380 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
21390 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
213a0 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
213b0 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f  t = (i64)pSavepo
213c0 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
213d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
213e0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
213f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21400 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21410 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
21420 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
21430 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
21440 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
21450 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
21460 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
21470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21480 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
21490 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
214a0 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
214b0 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50  t==(i64)ii*(4+pP
214c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
214d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
214e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
214f0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
21500 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
21510 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21520 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21530 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
21540 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
21550 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
21560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21570 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
21580 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
21590 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
215a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
215b0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
215c0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
215d0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
215e0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
215f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21600 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
21610 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21620 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
21630 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
21640 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
21650 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
21660 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
21670 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
21680 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20  P_SIZE based on 
21690 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
216a0 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a  e of szMmap..*/.
216b0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
216c0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67  rFixMaplimit(Pag
216d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
216e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
216f0 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65  _SIZE>0.  sqlite
21700 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
21710 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69  ger->fd;.  if( i
21720 73 4f 70 65 6e 28 66 64 29 20 29 7b 0a 20 20 20  sOpen(fd) ){.   
21730 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
21740 7a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62  z;.    pPager->b
21750 55 73 65 46 65 74 63 68 20 3d 20 28 66 64 2d 3e  UseFetch = (fd->
21760 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
21770 6f 6e 3e 3d 33 29 20 26 26 20 70 50 61 67 65 72  on>=3) && pPager
21780 2d 3e 73 7a 4d 6d 61 70 3e 30 3b 0a 20 20 20 20  ->szMmap>0;.    
21790 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d  sz = pPager->szM
217a0 6d 61 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  map;.    sqlite3
217b0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
217c0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
217d0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
217e0 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a  SIZE, &sz);.  }.
217f0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
21800 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
21810 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d  um size of any m
21820 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
21830 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
21840 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
21850 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21860 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20  MmapLimit(Pager 
21870 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
21880 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
21890 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70    pPager->szMmap
218a0 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67   = szMmap;.  pag
218b0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
218c0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
218d0 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  Free as much mem
218e0 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
218f0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a  from the pager..
21900 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21910 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72  agerShrink(Pager
21920 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
21930 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b  ite3PcacheShrink
21940 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21950 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
21960 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
21970 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
21980 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
21990 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
219a0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
219b0 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
219c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
219d0 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
219e0 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
219f0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
21a00 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
21a10 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
21a20 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
21a30 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
21a40 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
21a50 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21a70 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
21a80 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
21a90 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
21aa0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
21ab0 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
21ac0 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
21ad0 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
21ae0 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
21af0 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
21b00 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
21b10 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
21b20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
21b30 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
21b40 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
21b50 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
21b60 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
21b70 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
21b80 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
21b90 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
21ba0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
21bc0 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
21bd0 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
21be0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
21bf0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21c00 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
21c10 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
21c20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
21c30 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
21c40 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
21c50 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
21c60 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
21c70 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
21c80 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
21c90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
21ca0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
21cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
21cd0 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
21ce0 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
21cf0 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
21d00 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
21d10 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
21d20 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
21d30 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
21d40 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
21d50 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
21d60 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
21d70 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
21d80 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
21d90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
21da0 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
21db0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
21dc0 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
21dd0 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
21de0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
21df0 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
21e00 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f  k..**.** The abo
21e10 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c  ve is for a roll
21e20 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  back-journal mod
21e30 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65  e.  For WAL mode
21e40 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a  , OFF continues.
21e50 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20  ** to mean that 
21e60 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63  no syncs ever oc
21e70 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61  cur.  NORMAL mea
21e80 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20  ns that the WAL 
21e90 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69  is synced.** pri
21ea0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
21eb0 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  of checkpoint an
21ec0 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
21ed0 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63  ase file is sync
21ee0 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ed.** at the con
21ef0 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  clusion of the c
21f00 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
21f10 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
21f20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61  of the WAL.** wa
21f30 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  s written back i
21f40 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
21f50 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f  .  But no sync o
21f60 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20  perations occur 
21f70 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  for.** an ordina
21f80 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52  ry commit in NOR
21f90 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41  MAL mode with WA
21fa0 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74  L.  FULL means t
21fb0 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66  hat the WAL.** f
21fc0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f  ile is synced fo
21fd0 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d  llowing each com
21fe0 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  mit operation, i
21ff0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
22000 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63  e.** syncs assoc
22010 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41  iated with NORMA
22020 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  L..**.** Do not 
22030 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e  confuse synchron
22040 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51  ous=FULL with SQ
22050 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20  LITE_SYNC_FULL. 
22060 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   The.** SQLITE_S
22070 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d  YNC_FULL macro m
22080 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20  eans to use the 
22090 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c  MacOSX-style ful
220a0 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67  l-fsync.** using
220b0 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59   fcntl(F_FULLFSY
220c0 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e  NC).  SQLITE_SYN
220d0 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74  C_NORMAL means t
220e0 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  o do an.** ordin
220f0 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c  ary fsync() call
22100 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
22110 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
22120 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  n SQLITE_SYNC_FU
22130 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45  LL.** and SQLITE
22140 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20  _SYNC_NORMAL on 
22150 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20  platforms other 
22160 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75  than MacOSX.  Bu
22170 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f  t the.** synchro
22180 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73  nous=FULL versus
22190 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
221a0 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65  MAL setting dete
221b0 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74  rmines when.** t
221c0 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69  he xSync primiti
221d0 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  ve is called and
221e0 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20   is relevant to 
221f0 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a  all platforms..*
22200 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
22210 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
22220 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
22230 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
22240 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
22250 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
22260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
22270 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
22280 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
22290 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61  afetyLevel(.  Pa
222a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
222b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
222c0 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
222d0 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  evel for */.  in
222e0 74 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  t level,        
222f0 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79      /* PRAGMA sy
22300 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46  nchronous.  1=OF
22310 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46  F, 2=NORMAL, 3=F
22320 55 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62  ULL */  .  int b
22330 46 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20  FullFsync,      
22340 20 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66   /* PRAGMA fullf
22350 73 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43  sync */.  int bC
22360 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20  kptFullFsync    
22370 2f 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70  /* PRAGMA checkp
22380 6f 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a  oint_fullfsync *
22390 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c  /.){.  assert( l
223a0 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c  evel>=1 && level
223b0 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  <=3 );.  pPager-
223c0 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
223d0 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
223e0 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
223f0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
22400 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
22410 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
22420 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28  ile) ?1:0;.  if(
22430 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
22440 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
22450 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
22460 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
22470 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  ncFlags = 0;.  }
22480 65 6c 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73  else if( bFullFs
22490 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
224a0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
224b0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
224c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
224d0 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
224e0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
224f0 20 7d 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74   }else if( bCkpt
22500 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20  FullFsync ){.   
22510 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22520 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22530 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
22540 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22550 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22560 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _FULL;.  }else{.
22570 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22580 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22590 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
225a0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
225b0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
225c0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
225d0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
225e0 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d  cFlags = pPager-
225f0 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66  >syncFlags;.  if
22600 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
22610 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
22620 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c  ->walSyncFlags |
22630 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  = WAL_SYNC_TRANS
22640 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23  ACTIONS;.  }.}.#
22650 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
22660 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
22670 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
22680 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
22690 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
226a0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
226b0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
226c0 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
226d0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
226e0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
226f0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
22700 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
22710 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
22720 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
22730 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
22740 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
22750 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
22760 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
22770 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
22780 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
22790 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
227a0 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
227b0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
227c0 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
227d0 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
227e0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
227f0 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
22800 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
22810 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
22820 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
22830 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
22840 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
22850 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
22860 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
22870 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
22880 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
22890 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
228a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
228b0 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
228c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
228d0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
228e0 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
228f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22900 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
22910 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
22920 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
22930 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
22940 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
22950 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
22960 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
22970 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
22980 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
22990 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
229a0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
229b0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
229c0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
229d0 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
229e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
229f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
22a00 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
22a10 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
22a20 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
22a30 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
22a40 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
22a50 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
22a60 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
22a70 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
22a80 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
22a90 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
22ab0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22ac0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
22ad0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
22ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
22af0 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
22b00 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
22b10 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
22b20 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
22b30 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
22b40 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
22b50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
22b60 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
22b70 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
22b80 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
22b90 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
22ba0 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
22bb0 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
22bc0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
22bd0 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
22be0 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
22bf0 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
22c00 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
22c10 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
22c20 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
22c30 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
22c40 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
22c50 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
22c60 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
22c70 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
22c80 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
22c90 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
22ca0 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
22cb0 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
22cc0 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
22cd0 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
22ce0 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
22cf0 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
22d00 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
22d10 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
22d30 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
22d40 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
22d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d80 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
22d90 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
22da0 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
22db0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
22dc0 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
22dd0 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
22de0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
22df0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
22e00 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
22e10 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
22e20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
22e30 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
22e40 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
22e50 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
22e60 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
22e70 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
22e80 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
22e90 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
22ea0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
22eb0 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
22ec0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
22ed0 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
22ee0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
22ef0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22f00 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
22f10 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
22f40 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
22f50 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
22f60 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
22f70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
22f80 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
22f90 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
22fa0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22fc0 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
22fd0 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
22fe0 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72  r */.){.  pPager
22ff0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
23000 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
23010 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
23020 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
23030 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69  HandlerArg;..  i
23040 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
23050 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69  ->fd) ){.    voi
23060 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a  d **ap = (void *
23070 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79  *)&pPager->xBusy
23080 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73  Handler;.    ass
23090 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f  ert( ((int(*)(vo
230a0 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d  id *))(ap[0]))==
230b0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a  xBusyHandler );.
230c0 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31      assert( ap[1
230d0 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41  ]==pBusyHandlerA
230e0 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rg );.    sqlite
230f0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
23100 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
23110 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59  QLITE_FCNTL_BUSY
23120 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a  HANDLER, (void *
23130 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  )ap);.  }.}../*.
23140 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
23150 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
23160 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
23170 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
23180 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
23190 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
231a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
231b0 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
231c0 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
231d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
231e0 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
231f0 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
23200 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
23210 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
23220 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
23230 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
23240 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c  TE_IOERR, an SQL
23250 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75  ITE_IOERR_xxx su
23260 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45  b-code or SQLITE
23270 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
23280 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
23290 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
232a0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
232b0 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
232c0 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
232d0 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
232e0 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
232f0 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
23300 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
23310 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
23320 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
23330 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
23340 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
23350 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
23360 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
23370 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
23380 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
23390 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
233a0 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
233b0 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
233c0 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
233d0 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
233e0 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
233f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
23400 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
23410 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
23420 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
23430 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23440 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
23450 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
23460 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
23470 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
23480 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
23490 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
234a0 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
234b0 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
234c0 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
234d0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
234e0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
234f0 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
23500 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
23510 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
23520 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
23530 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
23540 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23550 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
23560 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
23570 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
23580 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
23590 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
235a0 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
235b0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
235c0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
235d0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
235e0 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
235f0 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
23600 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
23610 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
23620 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
23630 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
23640 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
23650 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
23660 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
23670 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
23680 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
23690 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65  ager, u32 *pPage
236a0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
236b0 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
236c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
236d0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
236e0 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c  ble to do a full
236f0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
23700 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74  ate() here, as t
23710 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
23720 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
23730 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65  from within Page
23740 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20  rOpen(), before 
23750 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f  the state.  ** o
23760 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
23770 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ct is internally
23780 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
23790 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f  *.  ** At one po
237a0 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  int this functio
237b0 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  n returned an er
237c0 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72  ror if the pager
237d0 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41   was in .  ** PA
237e0 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
237f0 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52   But since PAGER
23800 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61  _ERROR state gua
23810 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a  rantees that.  *
23820 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65  * there is at le
23830 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
23840 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
23850 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ce, this functio
23860 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  n.  ** is a no-o
23870 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  p for that case 
23880 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20  anyhow..  */..  
23890 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u32 pageSize = *
238a0 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
238b0 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
238c0 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
238d0 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
238e0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
238f0 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28  SIZE) );.  if( (
23900 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
23910 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
23920 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c  ze==0).   && sql
23930 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
23940 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
23950 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61  he)==0 .   && pa
23960 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
23970 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d  ze!=(u32)pPager-
23980 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
23990 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
239a0 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
239b0 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
239c0 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  pace */.    i64 
239d0 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  nByte = 0;..    
239e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
239f0 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  te>PAGER_OPEN &&
23a00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
23a10 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  fd) ){.      rc 
23a20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
23a30 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
23a40 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20  &nByte);.    }. 
23a50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e  E_OK ){.      pN
23a70 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
23a80 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
23a90 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
23aa0 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d  if( !pNew ) rc =
23ab0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23ac0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
23ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23ae0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
23af0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
23b00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
23b10 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70   (Pgno)((nByte+p
23b20 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53  ageSize-1)/pageS
23b30 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
23b40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
23b50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
23b60 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
23b70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
23b80 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23b90 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
23ba0 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
23bb0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
23bc0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
23bd0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
23be0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
23bf0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
23c00 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
23c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23c20 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
23c30 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
23c40 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
23c50 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
23c60 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
23c70 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
23c80 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
23c90 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
23ca0 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
23cb0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
23cc0 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
23cd0 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
23ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23d00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
23d10 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
23d20 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
23d30 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
23d40 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
23d50 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
23d60 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
23d70 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
23d80 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
23d90 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
23da0 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
23db0 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
23dc0 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
23dd0 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
23de0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
23df0 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
23e00 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
23e10 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
23e20 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
23e30 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
23e40 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
23e50 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
23e60 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
23e70 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
23e80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23e90 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
23ea0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
23eb0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
23ec0 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
23ed0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
23ee0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
23ef0 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
23f00 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
23f10 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
23f20 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
23f30 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
23f40 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
23f50 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
23f60 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
23f70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23f80 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
23f90 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
23fa0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
23fb0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
23fc0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
23fd0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
23fe0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
23ff0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
24000 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
24010 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
24020 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
24030 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
24040 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
24050 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
24060 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
24070 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
24080 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
24090 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
240a0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
240b0 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
240c0 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
240d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
240e0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
240f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
24100 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
24110 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
24120 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
24130 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
24140 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
24150 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24160 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
24170 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
24180 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
24190 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
241a0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
241b0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
241c0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
241d0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
241e0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
241f0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
24200 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
24210 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
24220 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24230 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24240 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
24250 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24260 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
24270 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
24280 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24290 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
242a0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
242b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
242c0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
242d0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
242e0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
242f0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
24300 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24310 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
24320 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24330 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
24340 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
24350 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24360 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
24370 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
24380 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24390 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
243a0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
243b0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
243c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
243d0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
243e0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
243f0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
24400 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
24410 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
24420 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
24430 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
24440 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
24450 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
24460 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
24470 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
24480 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
24490 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
244a0 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
244b0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
244c0 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
244d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
244e0 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
244f0 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
24500 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
24510 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
24520 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
24530 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
24540 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
24550 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
24560 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
24570 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
24580 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
24590 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
245a0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
245b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
245c0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
245d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
245e0 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
245f0 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
24600 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24610 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
24620 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
24630 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
24640 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
24650 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24660 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
24670 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
24680 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
24690 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
246a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
246b0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
246c0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
246d0 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
246e0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
246f0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
24700 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
24710 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
24720 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
24730 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
24740 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
24750 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
24760 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
24770 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
24780 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
24790 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
247a0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
247b0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
247c0 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
247d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
247e0 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
247f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24800 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
24810 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
24820 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
24830 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
24840 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24850 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24860 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
24870 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
24880 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
24890 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
248a0 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
248b0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
248c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
248d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
248e0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
248f0 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
24900 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
24910 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
24920 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
24930 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
24940 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
24950 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
24960 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
24970 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
24980 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
24990 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
249a0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
249b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
249c0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
249d0 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
249e0 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
249f0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
24a00 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
24a10 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
24a20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
24a30 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
24a40 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
24a50 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
24a60 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
24a70 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
24a80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
24a90 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
24aa0 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
24ab0 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
24ac0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
24ad0 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
24ae0 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
24af0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
24b00 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
24b10 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
24b20 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
24b30 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
24b40 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
24b50 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
24b60 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
24b70 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
24b80 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
24b90 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
24ba0 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
24bb0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24bc0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
24bd0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
24be0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
24bf0 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
24c00 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
24c10 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
24c20 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
24c30 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
24c40 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
24c50 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
24c60 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
24c70 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
24c80 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
24c90 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
24ca0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24cd0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
24ce0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
24cf0 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
24d00 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
24d10 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
24d20 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
24d30 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
24d40 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
24d50 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
24d60 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
24d70 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
24d80 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
24d90 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
24da0 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
24db0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
24dc0 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
24dd0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
24de0 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
24df0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
24e00 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
24e10 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
24e20 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
24e30 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
24e40 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
24e50 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
24e60 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
24e70 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
24e80 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
24e90 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
24ea0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
24eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
24ec0 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
24ed0 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
24ee0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
24ef0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
24f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
24f10 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
24f20 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
24f30 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
24f40 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
24f50 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
24f60 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
24f70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
24f80 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
24f90 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
24fa0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
24fb0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
24fc0 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
24fd0 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
24fe0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
24ff0 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
25000 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
25010 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
25020 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
25030 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
25040 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
25050 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
25060 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
25070 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
25080 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
25090 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
250a0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
250b0 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
250c0 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
250d0 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
250e0 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
250f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
25100 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
25110 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
25120 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
25130 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
25140 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
25150 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
25160 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
25170 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
25180 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25190 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
251a0 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
251b0 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
251c0 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
251d0 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
251e0 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
251f0 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
25200 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
25210 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
25220 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
25230 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
25240 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
25250 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
25260 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
25270 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
25280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25290 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
252a0 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
252b0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
252c0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
252d0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
252e0 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
252f0 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
25300 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25310 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
25320 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
25330 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
25340 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
25350 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
25360 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
25370 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
25380 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
25390 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
253a0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
253b0 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
253c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
253d0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
253e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
253f0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
25400 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
25410 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
25420 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
25430 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25440 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25450 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25460 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
25470 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
25480 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
25490 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
254a0 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
254b0 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
254c0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
254d0 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
254e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
254f0 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
25500 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
25510 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
25520 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
25530 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
25540 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
25550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25560 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
25570 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
25580 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
25590 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
255a0 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
255b0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
255c0 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
255d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
255e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
255f0 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
25600 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
25610 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
25620 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25630 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25640 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
25650 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
25660 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
25670 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
25680 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
25690 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
256a0 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
256b0 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
256c0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
256d0 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
256e0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
256f0 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
25700 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
25710 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
25720 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
25730 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
25740 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
25750 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
25760 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25770 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
25780 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
25790 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
257a0 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
257b0 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
257c0 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
257d0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
257e0 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
257f0 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
25800 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
25810 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
25820 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
25830 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
25840 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
25850 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
25860 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
25870 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
25880 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
25890 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
258a0 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
258b0 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
258c0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
258d0 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
258e0 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
258f0 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
25900 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
25910 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25920 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25930 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
25940 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
25950 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
25960 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
25970 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
25980 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
25990 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
259a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
259b0 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
259c0 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
259d0 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
259e0 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
259f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
25a00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
25a10 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
25a20 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
25a30 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
25a40 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
25a50 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
25a60 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
25a70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
25a80 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
25a90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
25aa0 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
25ab0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
25ac0 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
25ad0 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
25ae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
25af0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
25b00 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
25b10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
25b20 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
25b30 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
25b40 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
25b50 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
25b60 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
25b70 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
25b80 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
25b90 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
25ba0 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
25bb0 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
25bc0 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
25bd0 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
25be0 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
25bf0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
25c00 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
25c10 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
25c20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
25c30 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
25c40 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
25c50 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
25c60 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
25c70 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
25c80 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
25c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25ca0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
25cb0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
25cc0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
25cd0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
25ce0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
25cf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
25d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
25d20 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
25d30 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
25d40 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
25d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25d60 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65  *.** Obtain a re
25d70 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d  ference to a mem
25d80 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
25d90 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20  object for page 
25da0 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a  number pgno. .**
25db0 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
25dc0 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69  will use the poi
25dd0 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61  nter pData, obta
25de0 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68  ined from xFetch
25df0 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ()..** If succes
25e00 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67  sful, set *ppPag
25e10 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
25e20 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72  e new page refer
25e30 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ence.** and retu
25e40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
25e50 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
25e60 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
25e70 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  code and set.** 
25e80 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e  *ppPage to zero.
25e90 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65  .**.** Page refe
25ea0 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20  rences obtained 
25eb0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
25ec0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
25ed0 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62  be released.** b
25ee0 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52  y calling pagerR
25ef0 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e  eleaseMapPage().
25f00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
25f10 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
25f20 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
25f30 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
25f40 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
25f50 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  bject */.  Pgno 
25f60 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
25f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
25f80 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76  ge number */.  v
25f90 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20  oid *pData,     
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25fb0 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74  * xFetch()'d dat
25fc0 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  a for this page 
25fd0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  */.  PgHdr **ppP
25fe0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20  age             
25ff0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71       /* OUT: Acq
26000 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63  uired page objec
26010 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  t */.){.  PgHdr 
26020 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
26030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
26040 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
26050 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
26060 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  if( pPager->pMma
26070 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20  pFreelist ){.   
26080 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70   *ppPage = p = p
26090 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
260a0 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  list;.    pPager
260b0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
260c0 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
260d0 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
260e0 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45      memset(p->pE
260f0 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  xtra, 0, pPager-
26100 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73  >nExtra);.  }els
26110 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
26120 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71   p = (PgHdr *)sq
26130 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
26140 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20  sizeof(PgHdr) + 
26150 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
26160 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
26170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
26180 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
26190 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
261a0 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
261b0 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
261c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
261d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
261e0 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28     p->pExtra = (
261f0 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20  void *)&p[1];.  
26200 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48    p->flags = PGH
26210 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e  DR_MMAP;.    p->
26220 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d  nRef = 1;.    p-
26230 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
26240 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
26250 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69   p->pExtra==(voi
26260 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61  d *)&p[1] );.  a
26270 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d  ssert( p->pPage=
26280 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26290 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f  p->flags==PGHDR_
262a0 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74  MMAP );.  assert
262b0 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ( p->pPager==pPa
262c0 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
262d0 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a   p->nRef==1 );..
262e0 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f    p->pgno = pgno
262f0 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70  ;.  p->pData = p
26300 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Data;.  pPager->
26310 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72  nMmapOut++;..  r
26320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
26340 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
26350 20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d   page pPg. pPg m
26360 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
26370 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a  turned by an .**
26380 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
26390 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
263a0 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
263b0 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65  c void pagerRele
263c0 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72  aseMapPage(PgHdr
263d0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
263e0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
263f0 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  Pager;.  pPager-
26400 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70  >nMmapOut--;.  p
26410 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
26420 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26430 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d  st;.  pPager->pM
26440 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50  mapFreelist = pP
26450 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
26460 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
26470 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20  ds->iVersion>=3 
26480 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  );.  sqlite3OsUn
26490 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
264a0 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e  , (i64)(pPg->pgn
264b0 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
264c0 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74  eSize, pPg->pDat
264d0 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  a);.}../*.** Fre
264e0 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65  e all PgHdr obje
264f0 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  cts stored in th
26500 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65  e Pager.pMmapFre
26510 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73  elist list..*/.s
26520 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
26530 46 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65  FreeMapHdrs(Page
26540 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
26550 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20  Hdr *p;.  PgHdr 
26560 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
26570 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26580 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78  elist; p; p=pNex
26590 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
265a0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73  p->pDirty;.    s
265b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
265c0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68    }.}.../*.** Sh
265d0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
265e0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
265f0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
26600 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
26610 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
26620 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
26630 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
26640 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
26650 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
26660 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
26670 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
26680 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
26690 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
266a0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
266b0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
266c0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
266d0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
266e0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
266f0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
26700 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
26710 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
26720 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
26730 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
26740 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
26750 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
26760 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
26770 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
26780 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
26790 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
267a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
267b0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
267c0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
267d0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
267e0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
267f0 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
26800 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
26810 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
26820 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26830 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
26840 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
26850 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
26860 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
26870 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
26880 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
26890 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61  Pager) );.  disa
268a0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
268b0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
268c0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
268d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72  alloc();.  pager
268e0 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67  FreeMapHdrs(pPag
268f0 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  er);.  /* pPager
26900 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a  ->errCode = 0; *
26910 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  /.  pPager->excl
26920 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23  usiveMode = 0;.#
26930 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26940 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33  IT_WAL.  sqlite3
26950 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
26960 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63  >pWal, pPager->c
26970 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50  kptSyncFlags, pP
26980 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26990 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d  pTmp);.  pPager-
269a0 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  >pWal = 0;.#endi
269b0 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  f.  pager_reset(
269c0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d  pPager);.  if( M
269d0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65  EMDB ){.    page
269e0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
269f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26a00 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c  * If it is open,
26a10 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
26a20 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  l file before ca
26a30 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52  lling UnlockAndR
26a40 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  ollback..    ** 
26a50 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64  If this is not d
26a60 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73  one, then an uns
26a70 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
26a80 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
26a90 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d  l .    ** file m
26aa0 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ay be played bac
26ab0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
26ac0 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
26ad0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a  failure occurs .
26ae0 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69      ** while thi
26af0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
26b00 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
26b10 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
26b20 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
26b30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26b40 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
26b50 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75   to sync the jou
26b60 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20  rnal, shift the 
26b70 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74  pager.    ** int
26b80 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
26b90 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55  e. This causes U
26ba0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
26bb0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20   to unlock the. 
26bc0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
26bd0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  nd close the jou
26be0 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75  rnal file withou
26bf0 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
26c00 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62  roll it.    ** b
26c10 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20  ack or finalize 
26c20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74  it. The next dat
26c30 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20  abase user will 
26c40 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a  have to do hot-j
26c50 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f  ournal.    ** ro
26c60 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63  llback before ac
26c70 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
26c80 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
26c90 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  /.    if( isOpen
26ca0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
26cb0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
26cc0 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72  or(pPager, pager
26cd0 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
26ce0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
26cf0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
26d00 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
26d10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
26d20 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
26d30 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
26d40 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
26d50 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
26d60 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
26d70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
26d80 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
26d90 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
26da0 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
26db0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
26dc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  );.  sqlite3OsCl
26dd0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
26de0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
26df0 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69  ee(pTmp);.  sqli
26e00 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
26e10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
26e20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26e30 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
26e40 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
26e50 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
26e60 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
26e70 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a  pCodec);.#endif.
26e80 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
26e90 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26  er->aSavepoint &
26ea0 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  & !pPager->pInJo
26eb0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
26ec0 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
26ed0 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
26ee0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
26ef0 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
26f00 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
26f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26f20 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
26f30 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
26f40 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
26f50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
26f60 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
26f70 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50  r page pPg..*/.P
26f80 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
26f90 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
26fa0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
26fb0 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  n pPg->pgno;.}.#
26fc0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
26fd0 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
26fe0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
26ff0 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64  age pPg..*/.void
27000 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
27010 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
27020 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
27030 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(pPg);.}../*.**
27040 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
27050 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
27060 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
27070 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
27080 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
27090 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
270a0 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
270b0 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
270c0 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
270d0 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20  disk and can be 
270e0 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  restored in the 
270f0 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a  event of a hot-j
27100 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
27110 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61  .**.** If the Pa
27120 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20  ger.noSync flag 
27130 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
27140 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
27150 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
27160 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
27170 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
27180 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
27190 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a  mode and the .**
271a0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
271b0 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66  ristics of the f
271c0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
271d0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
271e0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
271f0 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
27200 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
27210 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
27220 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
27230 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
27240 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
27250 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
27260 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
27270 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
27280 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
27290 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
272a0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
272b0 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
272c0 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
272d0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
272e0 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
272f0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
27300 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
27310 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
27320 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
27330 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
27340 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
27350 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
27360 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
27370 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
27380 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
27390 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
273a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
273b0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
273c0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
273d0 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
273e0 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
273f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27400 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
27410 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
27420 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
27430 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
27440 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
27450 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
27460 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
27470 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
27480 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
27490 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
274a0 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
274b0 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
274c0 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
274d0 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
274e0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
274f0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
27500 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
27510 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
27520 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
27530 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
27540 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
27550 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
27560 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
27570 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
27580 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
27590 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
275a0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
275b0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
275c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
275d0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
275e0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
275f0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
27600 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
27610 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27630 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
27640 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
27650 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
27660 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
27670 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
27680 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
27690 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
276a0 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
276b0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
276c0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
276d0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
276e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
276f0 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
27700 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
27710 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
27720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27730 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
27740 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
27750 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
27760 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
27770 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
27780 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27790 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
277a0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
277b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
277c0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
277d0 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
277e0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
277f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
27800 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
27810 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
27820 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
27830 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
27840 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
27850 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
27860 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
27870 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
27880 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
27890 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
278a0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
278b0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
278c0 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
278d0 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
278e0 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
278f0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
27900 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
27910 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27920 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
27930 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
27940 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
27950 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
27960 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
27970 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
27980 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
27990 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
279a0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
279b0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
279c0 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
279d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
279e0 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
279f0 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
27a00 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
27a10 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
27a20 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
27a30 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
27a40 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
27a50 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
27a60 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
27a70 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
27a80 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
27a90 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
27aa0 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
27ab0 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
27ac0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
27ad0 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
27ae0 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
27af0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
27b00 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
27b10 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
27b20 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
27b30 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
27b40 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
27b50 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
27b60 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
27b70 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
27b80 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
27b90 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
27ba0 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
27bb0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
27bc0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
27bd0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
27be0 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
27bf0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
27c00 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
27c10 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
27c20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
27c30 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
27c40 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
27c50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
27c60 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
27c70 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
27c80 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
27c90 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
27ca0 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
27cb0 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
27cc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
27cd0 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
27ce0 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
27cf0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
27d00 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
27d10 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
27d20 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
27d30 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
27d40 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
27d50 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
27d60 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
27d70 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
27d80 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
27d90 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
27da0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
27db0 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
27dc0 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
27dd0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
27de0 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
27df0 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
27e00 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
27e10 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
27e20 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
27e30 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
27e40 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
27e50 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
27e60 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
27e70 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
27e80 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
27e90 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
27ea0 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
27eb0 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
27ec0 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
27ed0 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
27ee0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
27ef0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
27f00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
27f10 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
27f20 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
27f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27f40 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
27f50 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
27f60 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
27f70 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
27f80 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
27f90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27fa0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
27fb0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
27fc0 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
27fd0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
27fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27ff0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28000 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
28010 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
28020 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
28030 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28040 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
28050 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
28060 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
28070 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
28080 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
28090 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
280a0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
280b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
280c0 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
280d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
280e0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
280f0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
28100 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
28110 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
28120 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
28130 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
28140 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
28150 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28160 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
28170 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
28180 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
28190 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
281a0 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
281b0 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
281c0 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
281d0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
281e0 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
281f0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
28200 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
28210 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
28220 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
28230 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
28240 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
28250 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
28260 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
28270 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
28280 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
28290 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
282a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
282b0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
282c0 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
282d0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
282e0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
282f0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
28300 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
28310 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
28320 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
28330 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
28340 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
28350 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
28360 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28370 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
28380 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
28390 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
283a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
283b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
283c0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
283d0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
283e0 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
283f0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
28400 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
28410 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28420 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
28430 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28440 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
28450 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
28460 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28470 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28480 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28490 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
284a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
284b0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
284c0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
284d0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
284e0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
284f0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
28500 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28510 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
28520 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28530 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
28540 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28550 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
28560 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
28570 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20  syncFlags| .    
28580 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
28590 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  yncFlags==SQLITE
285a0 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
285b0 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
285c0 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
285d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
285e0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
285f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
28600 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
28610 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
28620 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
28630 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
28640 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28650 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
28660 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
28670 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
28680 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
28690 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
286a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
286b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
286c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
286d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
286e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
286f0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
28700 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
28710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
28720 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
28730 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
28740 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
28750 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
28760 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
28770 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
28780 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
28790 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
287a0 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
287b0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
287c0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
287d0 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
287e0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
287f0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
28800 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
28810 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
28820 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28830 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
28840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28850 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
28860 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
28870 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
28880 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
28890 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
288a0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
288b0 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
288c0 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
288d0 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
288e0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
288f0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
28900 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28910 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
28920 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
28930 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
28940 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
28950 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
28960 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
28970 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
28980 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
28990 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
289a0 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
289b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
289c0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
289d0 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
289e0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
289f0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
28a00 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
28a10 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
28a20 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
28a30 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
28a40 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
28a50 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
28a60 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
28a70 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
28a80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28a90 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
28aa0 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
28ab0 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
28ac0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
28ad0 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
28ae0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
28af0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
28b00 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
28b10 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
28b20 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
28b30 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
28b40 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
28b50 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
28b60 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
28b70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
28b80 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
28b90 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
28ba0 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
28bb0 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
28bc0 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
28bd0 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
28be0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
28bf0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
28c00 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
28c10 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
28c20 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
28c30 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
28c40 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
28c50 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
28c60 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
28c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
28c80 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
28c90 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
28ca0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
28cb0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
28cc0 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
28cd0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
28ce0 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
28cf0 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
28d00 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
28d10 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
28d20 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
28d30 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
28d40 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
28d50 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
28d60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
28d70 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
28d80 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
28d90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
28da0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
28db0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
28dc0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
28dd0 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
28de0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
28df0 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
28e00 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
28e10 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
28e20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
28e30 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
28e40 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
28e50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
28e60 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
28e70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
28e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
28e90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
28ea0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
28eb0 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
28ec0 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
28ed0 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
28ee0 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
28ef0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
28f00 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
28f10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28f20 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28f30 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b  _WRITER_DBMOD );
28f40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28f50 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
28f60 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
28f70 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
28f80 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
28f90 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
28fa0 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
28fb0 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
28fc0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
28fd0 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
28fe0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
28ff0 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
29000 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
29010 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
29020 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
29030 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
29040 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
29050 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
29060 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29070 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
29080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
29090 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
290a0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
290b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
290c0 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
290d0 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
290e0 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
290f0 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
29100 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
29110 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
29120 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
29130 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
29140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
29150 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
29160 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ) );.  if( rc==S
29170 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
29180 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 3f  (pList->pDirty ?
29190 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
291a0 3a 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2b 31 29  : pList->pgno+1)
291b0 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  >pPager->dbHintS
291c0 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 73 71  ize .  ){.    sq
291d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69  lite3_int64 szFi
291e0 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  le = pPager->pag
291f0 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33  eSize * (sqlite3
29200 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64  _int64)pPager->d
29210 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74  bSize;.    sqlit
29220 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
29230 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
29240 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
29250 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29  E_HINT, &szFile)
29260 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
29270 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
29280 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a  r->dbSize;.  }..
29290 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
292a0 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
292b0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
292c0 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
292d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
292e0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
292f0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
29300 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
29310 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
29320 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
29330 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
29340 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
29350 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
29360 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
29370 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
29380 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
29390 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
293a0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
293b0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
293c0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
293d0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
293e0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
293f0 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
29400 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
29410 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
29420 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
29430 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
29440 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
29450 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
29460 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
29470 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
29480 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
29490 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
294a0 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
294b0 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
294c0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
294d0 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
294e0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
294f0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
29500 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
29530 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
29540 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
29550 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
29560 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
29570 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
29580 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
29590 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
295a0 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a  ounter(pList);..
295b0 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
295c0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
295d0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
295e0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
295f0 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
29600 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
29610 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
29620 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
29630 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
29640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29650 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
29660 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
29670 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
29680 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
29690 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
296a0 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
296b0 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
296c0 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
296d0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
296e0 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
296f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29700 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
29710 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
29720 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
29730 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
29740 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
29750 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
29760 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
29770 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
29780 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
29790 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
297a0 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
297b0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
297c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
297d0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
297e0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
297f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
29800 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
29810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29820 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
29830 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b  GER_STAT_WRITE]+
29840 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  +;..      /* Upd
29850 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
29860 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
29870 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
29880 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
29890 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
298a0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
298b0 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
298c0 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
298d0 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
298e0 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
298f0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
29900 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
29910 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
29920 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
29930 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
29940 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
29950 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
29960 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
29970 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
29980 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
29990 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
299a0 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c  _count);.    }el
299b0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
299c0 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25  RACE(("NOSTORE %
299d0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
299e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
299f0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
29a00 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
29a10 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ash(pList);.    
29a20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
29a30 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
29a40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29a50 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
29a60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
29a70 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69  le is open. If i
29a80 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
29a90 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n, this .** func
29aa0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
29ab0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
29ac0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
29ad0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
29ae0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
29af0 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
29b00 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
29b10 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29b20 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73  d if a call to s
29b30 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a  qlite3OsOpen() .
29b40 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  ** fails..*/.sta
29b50 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
29b60 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
29b70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
29b80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
29b90 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
29ba0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
29bb0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
29bc0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
29bd0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
29be0 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
29bf0 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
29c00 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
29c10 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
29c20 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
29c30 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
29c40 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
29c50 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
29c60 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
29c70 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
29c80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
29ca0 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
29cb0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
29cc0 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
29cd0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
29ce0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
29cf0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
29d00 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
29d10 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
29d20 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
29d30 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
29d40 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
29d50 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
29d60 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
29d70 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
29d80 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
29d90 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
29da0 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
29db0 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
29dc0 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
29dd0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
29de0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29df0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
29e00 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
29e10 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
29e20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
29e30 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
29e40 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
29e50 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
29e60 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
29e70 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
29e80 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
29e90 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
29ea0 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
29eb0 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
29ec0 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
29ed0 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
29ee0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
29ef0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
29f00 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
29f10 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
29f20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
29f30 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
29f40 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
29f50 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
29f60 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
29f70 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
29f80 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
29f90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29fa0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
29fb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
29fc0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
29fd0 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
29fe0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
29ff0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2a000 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
2a010 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
2a020 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2a030 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2a040 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
2a050 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
2a060 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20  (pPg) .         
2a070 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2a080 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2a090 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2a0a0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2a0b0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2a0c0 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2a0d0 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2a0e0 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2a0f0 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2a100 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2a110 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2a120 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2a130 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2a140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a150 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2a160 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2a170 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2a180 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2a190 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2a1a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2a1b0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2a1c0 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
2a1d0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2a1e0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2a1f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a200 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
2a210 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a220 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
2a230 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2a240 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2a250 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
2a260 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2a270 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
2a280 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
2a290 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2a2a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a2b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a2c0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2a2d0 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
2a2e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2a2f0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
2a300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2a310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a320 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2a330 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
2a340 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a350 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
2a360 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
2a370 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2a380 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2a390 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a3a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2a3b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2a3c0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2a3d0 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2a3e0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2a3f0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2a400 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2a410 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2a420 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2a430 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2a440 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2a450 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2a460 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2a470 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2a480 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2a490 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2a4a0 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2a4b0 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2a4c0 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2a4d0 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2a4e0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2a4f0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2a500 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2a510 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2a520 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2a530 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2a540 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2a550 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2a560 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2a570 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2a580 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2a590 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2a5a0 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2a5b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2a5c0 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2a5d0 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2a5e0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2a5f0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2a600 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2a610 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2a620 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2a630 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2a640 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2a650 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2a660 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2a670 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2a680 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2a690 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2a6a0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2a6b0 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2a6c0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2a6d0 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2a6e0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2a6f0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2a700 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2a710 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2a720 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2a730 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2a740 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2a750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2a760 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2a770 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2a780 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2a790 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2a7a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a7b0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2a7c0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2a7d0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2a7e0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2a7f0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2a800 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
2a810 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75  l flag is set du
2a820 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
2a830 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
2a840 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
2a850 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
2a860 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
2a870 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
2a880 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
2a890 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2a8a0 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
2a8b0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
2a8c0 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
2a8d0 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
2a8e0 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
2a8f0 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
2a900 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2a910 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c  flag inhibits al
2a920 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
2a930 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2a940 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
2a950 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
2a960 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
2a970 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  set during a rol
2a980 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lback..  **.  **
2a990 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73   Spilling is als
2a9a0 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65  o prohibited whe
2a9b0 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  n in an error st
2a9c0 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63  ate since that c
2a9d0 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74  ould.  ** lead t
2a9e0 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
2a9f0 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20  ption.   In the 
2aa00 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
2aa10 74 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69  taton it .  ** i
2aa20 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
2aa30 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2aa40 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c  tch() to be call
2aa50 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  ed with createFl
2aa60 61 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65  ag==1.  ** while
2aa70 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2aa80 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73  ate, hence it is
2aa90 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
2aaa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
2aab0 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69    ** be called i
2aac0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2aad0 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  e.  Nevertheless
2aae0 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e  , we include a N
2aaf0 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74  EVER().  ** test
2ab00 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73   for the error s
2ab10 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75  tate as a safegu
2ab20 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75  ard against futu
2ab30 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f  re changes..  */
2ab40 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2ab50 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2ab60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ab70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2ab80 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74  doNotSpill ) ret
2ab90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2aba0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
2abb0 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28  otSyncSpill && (
2abc0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
2abd0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
2abe0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2abf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2ac00 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
2ac10 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
2ac20 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
2ac30 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
2ac40 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
2ac50 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
2ac60 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  log. */.    if( 
2ac70 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2ac80 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20  (pPg) ){ .      
2ac90 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2aca0 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d  age(pPg); .    }
2acb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2acc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2acd0 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
2ace0 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
2acf0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2ad00 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
2ad10 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2ad20 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72  l file if requir
2ad30 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2ad40 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2ad50 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20  NEED_SYNC .     
2ad60 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2ad70 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2ad80 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a  CACHEMOD.    ){.
2ad90 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
2ada0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31  ournal(pPager, 1
2adb0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
2adc0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
2add0 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61  umber of this pa
2ade0 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ge is larger tha
2adf0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  n the current si
2ae00 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ze of.    ** the
2ae10 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
2ae20 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
2ae30 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2ae40 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
2ae50 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
2ae60 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  cause the call t
2ae70 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  o pager_write_pa
2ae80 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77  gelist() below w
2ae90 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61  ill not.    ** a
2aea0 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61  ctually write da
2aeb0 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69  ta to the file i
2aec0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
2aed0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69   **.    ** Consi
2aee0 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
2aef0 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
2af00 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ents:.    **.   
2af10 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   **   BEGIN;.   
2af20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
2af30 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
2af40 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
2af50 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   X>.    **     S
2af60 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20  AVEPOINT sp;.   
2af70 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e   **       <shrin
2af80 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
2af90 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20  to Y pages>.    
2afa0 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74  **       pagerSt
2afb0 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20  ress(page X).   
2afc0 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
2afd0 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20   TO sp;.    **. 
2afe0 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20     ** If (X>Y), 
2aff0 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53  then when pagerS
2b000 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20  tress is called 
2b010 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20  page X will not 
2b020 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  be written.    *
2b030 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2b040 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20  abase file, but 
2b050 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20  will be dropped 
2b060 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20  from the cache. 
2b070 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c  Then,.    ** fol
2b080 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
2b090 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
2b0a0 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
2b0b0 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
2b0c0 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d      ** data from
2b0d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b0e0 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65  le. This will be
2b0f0 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67   the copy of pag
2b100 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a  e X as it.    **
2b110 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72   was when the tr
2b120 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
2b130 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73  d, not as it was
2b140 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54   when "SAVEPOINT
2b150 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20   sp".    ** was 
2b160 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a  executed..    **
2b170 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
2b180 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
2b190 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
2b1a0 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
2b1b0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
2b1c0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  b-journal file n
2b1d0 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ow (if it is not
2b1e0 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c   already there),
2b1f0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
2b200 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f  .    ** be resto
2b210 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65  red to its curre
2b220 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  nt value when th
2b230 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
2b240 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78  p" is .    ** ex
2b250 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ecuted..    */. 
2b260 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20     if( NEVER(.  
2b270 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
2b280 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
2b290 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
2b2a0 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
2b2b0 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29  age(pPg).    ) )
2b2c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
2b2d0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2b2e0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2b2f0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
2b300 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2b310 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2b320 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2b330 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b340 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2b350 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
2b360 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2b370 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
2b380 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2b390 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
2b3a0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2b3b0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
2b3c0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
2b3d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b3e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
2b3f0 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
2b400 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2b410 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2b420 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2b430 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2b440 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
2b450 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
2b460 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2b470 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rc); .}.../*.** 
2b480 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2b490 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
2b4a0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
2b4b0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
2b4c0 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
2b4d0 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
2b4e0 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
2b4f0 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
2b500 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
2b510 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
2b520 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
2b530 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
2b540 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
2b550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2b560 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
2b570 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
2b580 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
2b590 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
2b5a0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
2b5b0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
2b5c0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
2b5d0 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
2b5e0 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
2b5f0 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
2b600 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
2b610 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
2b620 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
2b630 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
2b640 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2b650 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
2b660 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
2b670 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
2b680 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
2b690 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
2b6a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2b6b0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
2b6c0 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
2b6d0 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
2b6e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2b6f0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
2b700 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
2b710 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
2b720 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
2b730 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
2b740 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
2b750 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
2b760 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
2b770 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
2b780 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2b790 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2b7a0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2b7b0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2b7c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2b7d0 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2b7e0 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2b7f0 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2b800 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2b810 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2b820 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2b830 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2b840 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2b850 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2b860 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2b870 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2b880 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2b890 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2b8a0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2b8b0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2b8c0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2b8d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2b8e0 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2b8f0 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2b900 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2b910 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2b920 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2b930 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2b940 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2b950 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2b960 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2b970 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2b980 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2b990 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2b9a0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2b9b0 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2b9c0 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2b9d0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2b9e0 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2b9f0 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2ba00 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2ba10 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2ba20 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2ba30 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2ba40 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2ba50 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2ba60 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2ba70 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2ba80 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2ba90 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2baa0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2bab0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2bac0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2bad0 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2bae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2baf0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2bb00 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2bb10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2bb20 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2bb30 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2bb40 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2bb50 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2bb60 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2bb70 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2bb80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2bb90 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2bba0 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2bbb0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2bbc0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2bbd0 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2bbe0 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2bbf0 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2bc00 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2bc10 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2bc20 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2bc30 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2bc40 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2bc50 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2bc60 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2bc70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2bc80 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2bc90 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2bca0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2bcb0 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2bcc0 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2bcd0 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2bce0 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2bcf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2bd00 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2bd10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2bd20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2bd30 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2bd40 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2bd50 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2bd60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2bd70 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2bd80 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2bd90 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2bda0 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2bdb0 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2bdc0 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2bdd0 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2bde0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2bdf0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2be00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2be10 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2be20 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2be30 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2be40 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2be50 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2be60 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2be70 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2be80 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2be90 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2bea0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2beb0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2bec0 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2bed0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2bee0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2bef0 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2bf00 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2bf10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2bf20 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2bf30 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2bf40 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2bf50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2bf60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2bf70 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2bf80 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2bf90 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2bfa0 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2bfb0 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2bfc0 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2bfd0 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2bfe0 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2bff0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2c000 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2c010 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20  ). This.  ** is 
2c020 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
2c030 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
2c040 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
2c050 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2c060 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75  .  ** and a regu
2c070 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2c080 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68  -handle. Note th
2c090 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f  at a "regular jo
2c0a0 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20  urnal-handle".  
2c0b0 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70  ** may be a wrap
2c0c0 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63  per capable of c
2c0d0 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74  aching the first
2c0e0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
2c0f0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
2c100 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69  e in memory to i
2c110 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f  mplement the ato
2c120 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2c130 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a  zation (see .  *
2c140 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f  * source file jo
2c150 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20  urnal.c)..  */. 
2c160 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
2c170 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71  nalSize(pVfs)>sq
2c180 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2c190 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75  ize() ){.    jou
2c1a0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2c1b0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75  OUND8(sqlite3Jou
2c1c0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b  rnalSize(pVfs));
2c1d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f  .  }else{.    jo
2c1e0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2c1f0 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65  ROUND8(sqlite3Me
2c200 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b  mJournalSize());
2c210 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2c220 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2c230 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2c240 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2c250 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2c260 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2c270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2c280 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2c290 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2c2a0 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2c2b0 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2c2c0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2c2d0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2c2e0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c2f0 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2c300 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2c310 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2c320 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c330 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61  NOMEM;.      nPa
2c340 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c350 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2c360 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65  me);.      zFile
2c370 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  name = 0;.    }.
2c380 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2c390 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2c3a0 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2c3b0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2c3c0 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2c3d0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2c3e0 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2c3f0 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2c400 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2c410 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2c420 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2c430 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2c440 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2c450 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2c460 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2c470 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  [0] ){.    const
2c480 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50   char *z;.    nP
2c490 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
2c4a0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
2c4b0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2c4c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2c4d0 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29  (0, nPathname*2)
2c4e0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
2c4f0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2c500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2c510 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  MEM;.    }.    z
2c520 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
2c530 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
2c540 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
2c550 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
2c560 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63   fails */.    rc
2c570 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
2c580 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2c590 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
2c5a0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
2c5b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2c5c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c5d0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2c5e0 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69   z = zUri = &zFi
2c5f0 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  lename[sqlite3St
2c600 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
2c610 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
2c620 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b   *z ){.      z +
2c630 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2c640 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20  0(z)+1;.      z 
2c650 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2c660 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20  30(z)+1;.    }. 
2c670 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28     nUri = (int)(
2c680 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20  &z[1] - zUri);. 
2c690 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e     assert( nUri>
2c6a0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
2c6b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2c6c0 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2c6d0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2c6e0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2c6f0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2c700 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2c710 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2c720 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2c730 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2c740 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2c750 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2c760 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2c770 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2c780 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2c790 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2c7a0 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2c7b0 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2c7c0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2c7d0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2c7e0 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2c7f0 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2c800 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2c810 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2c820 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2c830 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2c840 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2c850 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2c870 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2c880 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2c890 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2c8a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
2c8b0 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
2c8c0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2c8d0 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65  ure, PCache obje
2c8e0 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72  ct, the.  ** thr
2c8f0 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ee file descript
2c900 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ors, the databas
2c910 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  e file name and 
2c920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
2c930 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65  * file name. The
2c940 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72   layout in memor
2c950 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  y is as follows:
2c960 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50  .  **.  **     P
2c970 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20  ager object     
2c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c990 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79  sizeof(Pager) by
2c9a0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43  tes).  **     PC
2c9b0 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20  ache object     
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2c9d0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2c9e0 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  () bytes).  **  
2c9f0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2ca00 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2ca10 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69     (pVfs->szOsFi
2ca20 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  le bytes).  **  
2ca30 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66     Sub-journal f
2ca40 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2ca50 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2ca60 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2ca70 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c      Main journal
2ca80 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2ca90 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2caa0 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2cab0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2cac0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2cad0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2cae0 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  1 bytes).  **   
2caf0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e    Journal file n
2cb00 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2cb10 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31    (nPathname+8+1
2cb20 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70   bytes).  */.  p
2cb30 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  Ptr = (u8 *)sqli
2cb40 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
2cb50 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
2cb60 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20  (*pPager)) +    
2cb70 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
2cb80 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ture */.    ROUN
2cb90 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b  D8(pcacheSize) +
2cba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43             /* PC
2cbb0 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
2cbc0 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e     ROUND8(pVfs->
2cbd0 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20  szOsFile) +     
2cbe0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62    /* The main db
2cbf0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75   file */.    jou
2cc00 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32  rnalFileSize * 2
2cc10 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   +          /* T
2cc20 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
2cc30 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
2cc40 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2cc50 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  i +         /* z
2cc60 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Filename */.    
2cc70 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20  nPathname + 8 + 
2cc80 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2              /
2cc90 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  * zJournal */.#i
2cca0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ccb0 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74  T_WAL.    + nPat
2ccc0 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20  hname + 4 + 2   
2ccd0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2cce0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2ccf0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2cd00 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2cd10 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2cd20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2cd30 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2cd40 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2cd50 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2cd60 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2cd70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2cd80 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2cd90 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2cda0 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2cdb0 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2cdc0 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2cdd0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2cde0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2cdf0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2ce00 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2ce10 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2ce20 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2ce30 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2ce40 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2ce50 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2ce60 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2ce70 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2ce80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2ce90 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2cea0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2ceb0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2cec0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2ced0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2cee0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2cef0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2cf00 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2cf10 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2cf20 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2cf30 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2cf40 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2cf50 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2cf60 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2cf70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2cf80 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2cf90 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2cfa0 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2cfb0 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2cfc0 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2cfd0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2cfe0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2cff0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d000 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  e);.    if( nUri
2d010 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65   ) memcpy(&pPage
2d020 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
2d030 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c  thname+1], zUri,
2d040 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2d050 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
2d060 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
2d070 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d080 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2d090 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d0a0 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30  me], "-journal\0
2d0b0 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73  00", 8+2);.    s
2d0c0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2d0d0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2d0e0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ame, pPager->zJo
2d0f0 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20  urnal);.#ifndef 
2d100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2d110 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c      pPager->zWal
2d120 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   = &pPager->zJou
2d130 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38  rnal[nPathname+8
2d140 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1];.    memcpy(
2d150 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
2d160 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d170 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2d180 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2d190 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c  athname], "-wal\
2d1a0 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20  000", 4+1);.    
2d1b0 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2d1c0 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2d1d0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57  name, pPager->zW
2d1e0 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  al);.#endif.    
2d1f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d200 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d   zPathname);.  }
2d210 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
2d220 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
2d230 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
2d240 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
2d250 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
2d260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2d270 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2d280 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
2d290 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d2b0 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
2d2c0 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
2d2d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2d2e0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2d2f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d300 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
2d310 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
2d320 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65  .    assert( !me
2d330 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f  mDb );.    readO
2d340 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2d350 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2d360 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2d370 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2d380 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2d390 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2d3a0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2d3b0 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2d3c0 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2d3d0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2d3e0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2d3f0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2d400 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2d410 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2d420 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2d430 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2d440 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2d450 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2d460 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2d470 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2d480 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2d490 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2d4a0 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2d4b0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2d4c0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2d4d0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2d4e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
2d4f0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
2d500 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2d510 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
2d520 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
2d530 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
2d540 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2d550 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
2d560 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2d570 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2d580 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
2d590 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
2d5a0 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
2d5b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d5c0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
2d5d0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2d5e0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2d5f0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2d600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d610 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2d620 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65   (u32)pPager->se
2d630 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
2d640 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
2d650 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2d660 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2d670 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
2d680 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
2d690 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2d6a0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
2d6b0 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
2d6c0 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
2d6d0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2d6e0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2d6f0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
2d700 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2d710 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
2d720 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
2d730 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2d740 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2d750 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
2d760 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
2d770 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
2d780 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2d790 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
2d7a0 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
2d7b0 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
2d7c0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
2d7d0 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
2d7e0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2d7f0 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
2d800 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d810 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2d820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2d830 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
2d840 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
2d850 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
2d860 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
2d870 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
2d880 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
2d890 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2d8a0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
2d8b0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
2d8c0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
2d8d0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
2d8e0 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
2d8f0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2d900 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2d910 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
2d920 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2d930 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
2d940 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2d950 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2d960 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
2d970 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2d980 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
2d990 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
2d9a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
2d9b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
2d9c0 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
2d9d0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
2d9e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2d9f0 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50  R_READER;.    pP
2da00 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58  ager->eLock = EX
2da10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
2da20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2da30 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2da40 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2da50 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2da60 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2da70 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2da80 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2da90 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2daa0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2dab0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2dac0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2dad0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2dae0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2daf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2db00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2db10 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2db20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2db30 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2db40 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2db50 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2db60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2db70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2db80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2db90 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
2dba0 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
2dbb0 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
2dbc0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2dbd0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2dbe0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2dbf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dc00 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2dc10 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
2dc20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
2dc30 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2dc40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2dc50 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2dc60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2dc70 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2dc80 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2dc90 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
2dca0 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2dcb0 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2dcc0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
2dcd0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2dce0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2dcf0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2dd10 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2dd20 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2dd30 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2dd40 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
2dd50 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2dd60 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2dd70 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2dd80 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2dd90 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2dda0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2ddb0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2ddc0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2ddd0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2dde0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2ddf0 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2de00 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2de10 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2de20 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2de30 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2de40 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2de50 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2de60 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2de70 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2de80 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2de90 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2dea0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2deb0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2dec0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2ded0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2dee0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2def0 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
2df00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
2df10 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
2df20 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
2df30 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
2df40 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
2df50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
2df60 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2df70 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
2df80 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
2df90 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
2dfa0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2dfb0 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
2dfc0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
2dfd0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2dfe0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
2dff0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
2e000 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2e010 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
2e020 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2e030 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2e040 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   .  pPager->chan
2e050 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
2e060 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2e070 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
2e080 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
2e090 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
2e0a0 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a  = (u8)readOnly;.
2e0b0 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75    assert( useJou
2e0c0 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  rnal || pPager->
2e0d0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50  tempFile );.  pP
2e0e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
2e0f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2e100 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
2e110 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
2e120 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
2e130 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  lSync==0 );.    
2e140 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e150 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  syncFlags==0 );.
2e160 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e170 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2e180 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e190 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  t( pPager->ckptS
2e1a0 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2e1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
2e1c0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31  er->fullSync = 1
2e1d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
2e1e0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2e1f0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2e200 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
2e210 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2e220 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41  SYNC_NORMAL | WA
2e230 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
2e240 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ONS;.    pPager-
2e250 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
2e260 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2e270 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  MAL;.  }.  /* pP
2e280 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2e290 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e2a0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2e2b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e2c0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2e2d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2e2e0 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2e2f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2e300 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2e310 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2e320 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2e330 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2e340 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2e350 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2e360 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2e370 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2e380 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2e390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2e3a0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2e3b0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2e3c0 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2e3d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2e3e0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2e3f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2e400 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2e410 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2e420 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2e430 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2e440 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2e450 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2e460 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2e470 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2e480 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2e490 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2e4a0 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  sh)); */.  /* pP
2e4b0 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53  ager->szMmap = S
2e4c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
2e4d0 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20  AP_SIZE // will 
2e4e0 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e  be set by btree.
2e4f0 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72  c */..  *ppPager
2e500 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
2e510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2e520 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ..../*.** This f
2e530 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2e540 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
2e550 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
2e560 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
2e570 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
2e580 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
2e590 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2e5a0 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
2e5b0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
2e5c0 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
2e5d0 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
2e5e0 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
2e5f0 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
2e600 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
2e610 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
2e620 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
2e630 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
2e640 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
2e650 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
2e660 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
2e670 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
2e680 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
2e690 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
2e6a0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
2e6b0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2e6c0 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2e6d0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
2e6e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
2e6f0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
2e700 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
2e710 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
2e720 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
2e730 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2e740 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
2e750 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2e760 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
2e770 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
2e780 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
2e790 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2e7a0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
2e7b0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
2e7c0 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
2e7d0 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
2e7e0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
2e7f0 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
2e800 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
2e810 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
2e820 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2e830 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e840 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
2e850 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
2e860 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
2e870 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2e880 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2e890 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
2e8a0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
2e8b0 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
2e8c0 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
2e8d0 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
2e8e0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2e8f0 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
2e900 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
2e910 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2e920 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
2e930 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
2e940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2e950 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
2e960 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
2e970 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2e980 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
2e990 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
2e9a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
2e9b0 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
2e9c0 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
2e9d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2e9e0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
2e9f0 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
2ea00 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
2ea10 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
2ea20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
2ea30 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
2ea40 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
2ea50 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
2ea60 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2ea70 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
2ea80 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2ea90 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
2eaa0 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
2eab0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2eac0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2ead0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2eae0 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
2eaf0 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
2eb00 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
2eb10 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
2eb20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
2eb30 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2eb40 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2eb50 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
2eb60 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2eb70 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
2eb80 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
2eb90 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
2eba0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
2ebb0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
2ebc0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
2ebd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ebe0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  OK;           /*
2ebf0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2ec00 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31    int exists = 1
2ec10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ec20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
2ec30 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2ec40 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72  sent */.  int jr
2ec50 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65  nlOpen = !!isOpe
2ec60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
2ec70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ec80 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2ec90 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2eca0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2ecb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ecc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2ecd0 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65  _OPEN );..  asse
2ece0 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
2ecf0 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
2ed00 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2ed10 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
2ed20 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
2ed30 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
2ed40 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
2ed50 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
2ed60 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
2ed70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2ed80 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
2ed90 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2eda0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
2edb0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
2edc0 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
2edd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ede0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
2edf0 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20  t locked = 0;   
2ee00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ee10 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
2ee20 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2ee30 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
2ee40 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
2ee50 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
2ee60 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
2ee70 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
2ee80 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
2ee90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
2eea0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
2eeb0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
2eec0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
2eed0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
2eee0 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
2eef0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
2ef00 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
2ef10 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
2ef20 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
2ef30 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
2ef40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2ef50 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
2ef60 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
2ef70 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
2ef80 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
2ef90 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2efa0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
2efb0 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
2efc0 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
2efd0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
2efe0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
2eff0 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
2f000 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
2f010 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
2f020 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
2f030 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
2f040 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
2f050 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
2f060 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
2f070 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
2f080 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
2f090 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ocked ){.      P
2f0a0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
2f0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2f0c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2f0d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2f0e0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  /..      /* Chec
2f0f0 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  k the size of th
2f100 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2f110 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20   If it consists 
2f120 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20  of 0 pages,.    
2f130 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65    ** then delete
2f140 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f150 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65  e. See the heade
2f160 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  r comment above 
2f170 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  for .      ** th
2f180 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65  e reasoning here
2f190 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62  .  Delete the ob
2f1a0 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
2f1b0 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20  ile under.      
2f1c0 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ** a RESERVED lo
2f1d0 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65  ck to avoid race
2f1e0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20   conditions and 
2f1f0 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69  to avoid violati
2f200 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33  ng.      ** [H33
2f210 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  020]..      */. 
2f220 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2f230 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2f240 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2f250 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f260 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
2f270 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
2f280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
2f290 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
2f2a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2f2b0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
2f2c0 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
2f2d0 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  CK)==SQLITE_OK )
2f2e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2f2f0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
2f300 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2f310 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
2f320 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2f330 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2f340 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   ) pagerUnlockDb
2f350 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2f360 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
2f370 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
2f380 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
2f390 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
2f3a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f3b0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
2f3c0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
2f3d0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
2f3e0 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
2f3f0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
2f400 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2f410 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2f420 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
2f430 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
2f440 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
2f450 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
2f460 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
2f470 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
2f480 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
2f490 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
2f4a0 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
2f4b0 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
2f4c0 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
2f4d0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
2f4e0 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
2f4f0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
2f500 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2f510 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2f520 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2f530 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f540 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
2f550 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
2f560 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f570 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2f580 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2f590 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2f5a0 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
2f5b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f5c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f5d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f5e0 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
2f5f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2f600 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
2f610 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
2f620 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
2f630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2f640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
2f650 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
2f660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f670 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f680 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f690 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
2f6a0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
2f6b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f6c0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2f6d0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
2f6e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2f6f0 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
2f700 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
2f710 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2f720 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
2f730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2f740 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
2f750 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
2f760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
2f770 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
2f780 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2f790 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
2f7a0 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
2f7b0 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
2f7c0 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
2f7d0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
2f7e0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
2f7f0 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
2f800 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
2f810 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
2f820 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
2f830 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
2f840 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2f850 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
2f860 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2f870 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
2f880 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
2f890 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
2f8a0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
2f8b0 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
2f8c0 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
2f8d0 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
2f8e0 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
2f8f0 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
2f900 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
2f910 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2f920 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
2f930 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
2f940 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
2f950 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
2f960 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
2f970 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2f980 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
2f990 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2f9a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f9b0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
2f9c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f9d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2f9e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2f9f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2fa00 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
2fa10 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
2fa20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2fa30 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
2fa40 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
2fa50 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
2fa60 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
2fa70 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
2fa80 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
2fa90 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
2faa0 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
2fab0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
2fac0 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
2fad0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2fae0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
2faf0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
2fb00 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
2fb10 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
2fb20 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
2fb30 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
2fb40 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
2fb50 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
2fb60 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
2fb70 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
2fb80 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
2fb90 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
2fba0 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2fbb0 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
2fbc0 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
2fbd0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2fbe0 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
2fbf0 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
2fc00 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
2fc10 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
2fc20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2fc30 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
2fc40 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
2fc50 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
2fc60 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
2fc70 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
2fc80 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
2fc90 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
2fca0 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
2fcb0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
2fcc0 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
2fcd0 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
2fce0 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
2fcf0 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
2fd00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fd10 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
2fd20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
2fd30 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
2fd40 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
2fd50 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
2fd60 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
2fd70 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
2fd80 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
2fd90 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
2fda0 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
2fdb0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
2fdc0 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
2fdd0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
2fde0 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
2fdf0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
2fe00 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
2fe10 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2fe20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
2fe30 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
2fe40 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
2fe50 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
2fe60 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
2fe70 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
2fe80 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
2fe90 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2fea0 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
2feb0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
2fec0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
2fed0 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  * occurs while l
2fee0 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
2fef0 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
2ff00 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
2ff10 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c  file or .** roll
2ff20 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
2ff30 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20  al file, the IO 
2ff40 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ff50 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2ff60 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
2ff70 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
2ff80 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2ff90 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2ffa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ffb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2ffc0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2ffd0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
2ffe0 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f  rom b-tree and o
2fff0 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61  nly when there a
30000 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74  re no.  ** outst
30010 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68  anding pages. Th
30020 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
30030 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  the pager state 
30040 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20  should either.  
30050 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45  ** be OPEN or RE
30060 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20  ADER. READER is 
30070 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
30080 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72   the pager is or
30090 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78   was in .  ** ex
300a0 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
300b0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
300c0 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
300d0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
300e0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
300f0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
30100 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
30110 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
30120 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30130 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
30140 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
30150 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
30160 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d  .  if( NEVER(MEM
30170 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  DB && pPager->er
30180 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e  rCode) ){ return
30190 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
301a0 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65  ; }..  if( !page
301b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
301c0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
301d0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e==PAGER_OPEN ){
301e0 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75  .    int bHotJou
301f0 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  rnal = 1;       
30200 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
30210 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74  ere exists a hot
30220 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f   journal-file */
30230 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ..    assert( !M
30240 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20  EMDB );..    rc 
30250 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
30260 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
30270 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
30280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30290 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
302a0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
302b0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
302c0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
302d0 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
302e0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
302f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
30300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30310 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
30320 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
30330 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
30340 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
30350 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
30360 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
30370 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
30380 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
30390 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
303a0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  <=SHARED_LOCK ){
303b0 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
303c0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
303d0 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b  , &bHotJournal);
303e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
303f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30400 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
30410 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
30420 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a   bHotJournal ){.
30430 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
30440 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
30450 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30460 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
30470 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ACK;.        got
30480 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
30490 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  }..      /* Get 
304a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
304b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
304c0 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
304d0 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
304e0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
304f0 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
30500 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
30510 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
30520 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
30530 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
30540 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
30550 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
30560 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
30570 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
30580 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
30590 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
305a0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
305b0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
305c0 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
305d0 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
305e0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
305f0 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
30600 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
30610 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
30620 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
30630 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
30640 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
30650 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
30660 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
30670 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
30680 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
30690 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
306a0 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
306b0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
306c0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
306d0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
306e0 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
306f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
30700 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
30710 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
30720 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
30730 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
30740 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  is in locking_mo
30750 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
30760 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20  e, the lock is. 
30770 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64       ** downgrad
30780 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43  ed to SHARED_LOC
30790 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  K before this fu
307a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
307b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
307c0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
307d0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
307e0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  E_LOCK);.      i
307f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30800 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
30810 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
30820 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  . .      /* If i
30830 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
30840 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69   open and the fi
30850 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  le exists on dis
30860 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20  k, open the .   
30870 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f     ** journal fo
30880 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
30890 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73  ess. Write acces
308a0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
308b0 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  cause .      ** 
308c0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
308d0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
308e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
308f0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a  l be kept open .
30900 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73        ** and pos
30910 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
30920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
30930 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69  er on. Also, wri
30940 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20  te-access .     
30950 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72   ** is usually r
30960 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c  equired to final
30970 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
30980 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
30990 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a  persist .      *
309a0 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f  * mode (and also
309b0 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   for journal_mod
309c0 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f  e=truncate on so
309d0 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20  me systems)..   
309e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
309f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
30a00 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
30a10 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
30a20 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
30a30 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
30a40 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
30a50 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
30a60 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
30a70 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
30a80 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
30a90 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
30aa0 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
30ab0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  t .      ** may 
30ac0 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
30ad0 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
30ae0 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
30af0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
30b00 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
30b10 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
30b20 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
30b30 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
30b40 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
30b50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
30b60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30b70 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
30b80 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
30b90 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  s;.        int b
30ba0 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  Exists;         
30bb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30bc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30bd0 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  sts */.        r
30be0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
30bf0 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20  ess(.           
30c00 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
30c10 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
30c20 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
30c30 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  bExists);.      
30c40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30c50 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29  _OK && bExists )
30c60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
30c70 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
30c80 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
30c90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
30ca0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
30cb0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
30cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
30cd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
30ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
30cf0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
30d00 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30d10 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
30d20 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
30d30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
30d40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30d50 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
30d60 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
30d70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30d80 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
30d90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
30da0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
30db0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
30dc0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
30dd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30de0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
30df0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
30e00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30e10 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
30e20 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
30e30 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
30e40 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
30e50 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
30e60 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
30e70 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
30e80 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
30e90 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
30ea0 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
30eb0 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
30ec0 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
30ed0 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
30ee0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
30ef0 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
30f00 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
30f10 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
30f20 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
30f30 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
30f40 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
30f50 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
30f60 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
30f70 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
30f80 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
30f90 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
30fa0 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
30fb0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
30fc0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
30fd0 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
30fe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
30ff0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
31000 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
31010 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
31020 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
31030 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
31040 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
31050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31070 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
31080 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
31090 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
310a0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
310b0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
310c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
310d0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
310e0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
310f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
31100 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
31110 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
31120 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
31150 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
31160 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
31170 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
31180 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
31190 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
311a0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
311b0 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
311c0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
311d0 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
311e0 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
311f0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
31200 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
31210 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
31220 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
31230 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
31240 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
31250 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
31260 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
31270 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
31280 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
31290 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
312a0 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
312b0 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
312c0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
312d0 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
312e0 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
312f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31300 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
31310 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
31320 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
31330 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
31340 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
31350 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
31360 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
31370 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
31380 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
31390 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
313a0 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
313b0 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
313c0 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
313d0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
313e0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
313f0 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
31400 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
31410 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
31420 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
31430 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
31440 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
31450 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
31460 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
31470 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
31480 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
31490 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
314a0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
314b0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
314c0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
314d0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
314e0 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
314f0 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
31500 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
31510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
31520 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
31530 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
31540 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31550 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
31560 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
31570 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
31580 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31590 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
315a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
315b0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
315c0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
315d0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
315e0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
315f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
31600 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
31610 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28 0a 20  >tempFile && (. 
31620 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
31630 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c 20  Backup .     || 
31640 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
31650 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
31660 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20  PCache)>0 .     
31670 7c 7c 20 55 53 45 46 45 54 43 48 28 70 50 61 67  || USEFETCH(pPag
31680 65 72 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  er).    )){.    
31690 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
316a0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
316b0 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
316c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
316d0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
316e0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
316f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
31700 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
31710 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
31720 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
31730 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
31740 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
31750 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
31760 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
31770 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
31780 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
31790 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
317a0 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
317b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
317c0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
317d0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
317e0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
317f0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
31800 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
31810 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
31820 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
31830 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
31840 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
31850 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
31860 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
31870 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
31880 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
31890 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
318a0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
318b0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
318c0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
318d0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
318e0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
318f0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
31900 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
31910 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
31920 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
31930 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
31940 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
31950 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
31960 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
31970 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
31980 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
31990 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
319a0 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
319b0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
319c0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
319d0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
319e0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
319f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
31a00 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
31a10 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
31a20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
31a30 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
31a40 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
31a50 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
31a60 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
31a70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
31a80 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
31a90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31aa0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
31ab0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
31ac0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
31ad0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
31ae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31af0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
31b00 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
31b10 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
31b20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
31b40 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
31b50 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
31b60 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
31b70 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
31b80 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
31b90 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
31ba0 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
31bb0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
31bc0 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
31bd0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
31be0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
31bf0 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
31c00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
31c10 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
31c20 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
31c30 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
31c40 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
31c50 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
31c60 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
31c70 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
31c80 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
31c90 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
31ca0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
31cb0 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
31cc0 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
31cd0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
31ce0 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
31cf0 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
31d00 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
31d10 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
31d20 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
31d30 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
31d40 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
31d50 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
31d60 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
31d70 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
31d80 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
31d90 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
31da0 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
31db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
31dc0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
31dd0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
31de0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31df0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
31e00 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
31e10 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
31e20 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
31e30 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
31e40 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
31e50 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
31e60 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
31e70 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
31e80 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
31e90 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
31ea0 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
31eb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31ec0 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
31ed0 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
31ee0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
31ef0 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
31f00 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
31f10 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
31f20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
31f30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
31f40 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
31f50 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
31f60 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
31f70 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
31f80 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
31f90 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
31fa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
31fb0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
31fc0 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
31fd0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
31fe0 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
31ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
32000 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
32010 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
32020 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
32030 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32040 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32050 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
32060 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32070 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
32080 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
320a0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
320b0 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
320c0 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
320d0 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
320e0 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
320f0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
32100 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
32110 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
32120 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
32130 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
32140 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
32150 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
32160 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
32170 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
32180 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
32190 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
321a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
321b0 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
321c0 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
321d0 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
321e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
321f0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
32200 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50  ==0 && (sqlite3P
32210 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
32220 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
32230 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
32240 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
32250 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
32260 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
32270 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
32280 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
32290 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
322a0 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
322b0 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
322c0 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
322d0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
322e0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
322f0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
32300 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
32310 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
32320 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
32330 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
32340 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
32350 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
32360 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
32370 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
32380 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
32390 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
323a0 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
323b0 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
323c0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
323d0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
323e0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
323f0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
32400 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
32410 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
32420 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
32430 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
32440 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
32450 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
32460 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
32470 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
32480 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
32490 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
324a0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
324b0 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
324c0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
324d0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
324e0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
324f0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
32500 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
32510 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
32520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32530 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
32540 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
32550 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
32560 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
32570 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
32580 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
32590 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
325a0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
325b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
325c0 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
325d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
325e0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
325f0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
32600 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
32610 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
32620 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
32630 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
32640 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
32650 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
32660 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
32670 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
32680 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
32690 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
326a0 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
326b0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
326c0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
326d0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
326e0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
326f0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
32700 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
32710 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
32720 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e  wo seperate scen
32730 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
32740 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
32750 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
32760 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
32770 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
32780 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
32790 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
327a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
327b0 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
327c0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
327d0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
327e0 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
327f0 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
32800 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
32810 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
32820 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
32830 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
32840 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
32850 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
32860 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
32870 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
32880 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
32890 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
328a0 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
328b0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
328c0 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
328d0 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
328e0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
328f0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
32900 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
32910 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
32920 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
32930 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
32940 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
32950 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
32960 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
32970 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
32980 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
32990 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
329a0 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
329b0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
329c0 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
329d0 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
329e0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
329f0 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
32a00 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
32a10 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
32a20 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
32a30 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
32a40 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
32a50 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
32a60 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
32a70 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
32a80 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
32a90 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
32aa0 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
32ab0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
32ac0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
32ad0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
32ae0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
32af0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
32b00 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
32b10 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
32b20 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
32b30 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
32b40 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
32b50 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
32b60 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
32b70 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
32b80 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
32b90 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
32ba0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
32bb0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
32bc0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
32bd0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
32be0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
32bf0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
32c00 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
32c10 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
32c20 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
32c30 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
32c40 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
32c50 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
32c60 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
32c70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
32c80 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
32c90 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
32ca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
32cb0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
32cc0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
32cd0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
32ce0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
32cf0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
32d00 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
32d10 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
32d20 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
32d30 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 41        /* PAGER_A
32d40 43 51 55 49 52 45 5f 58 58 58 20 66 6c 61 67 73  CQUIRE_XXX flags
32d50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
32d60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
32d70 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
32d80 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
32d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32da0 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
32db0 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
32dc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
32dd0 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67  oContent = (flag
32de0 73 20 26 20 50 41 47 45 52 5f 41 43 51 55 49 52  s & PAGER_ACQUIR
32df0 45 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  E_NOCONTENT);.. 
32e00 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
32e10 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
32e20 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
32e30 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
32e40 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
32e50 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
32e60 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
32e70 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
32e80 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
32e90 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
32ea0 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
32eb0 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
32ec0 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
32ed0 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
32ee0 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
32ef0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
32f00 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
32f10 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d  MmapOk = (pgno!=
32f20 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50  1 && USEFETCH(pP
32f30 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61  ager).   && (pPa
32f40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32f50 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
32f60 61 67 73 20 26 20 50 41 47 45 52 5f 41 43 51 55  ags & PAGER_ACQU
32f70 49 52 45 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20  IRE_READONLY)). 
32f80 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
32f90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
32fa0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
32fb0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
32fc0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
32fd0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
32fe0 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c   noContent==0 ||
32ff0 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a   bMmapOk==0 );..
33000 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
33010 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33020 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
33040 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
33050 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
33060 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
33070 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
33080 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
33090 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
330a0 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
330b0 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
330c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
330d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
330e0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
330f0 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a  Code;.  }else{..
33100 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20      if( bMmapOk 
33110 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
33120 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
33130 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
33140 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
33150 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
33160 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rame);.      if(
33170 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33180 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
33190 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
331a0 20 20 20 20 69 66 28 20 69 46 72 61 6d 65 3d 3d      if( iFrame==
331b0 30 20 26 26 20 62 4d 6d 61 70 4f 6b 20 29 7b 0a  0 && bMmapOk ){.
331c0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
331d0 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63  a = 0;..      rc
331e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63   = sqlite3OsFetc
331f0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20  h(pPager->fd, . 
33200 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70           (i64)(p
33210 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
33220 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65  >pageSize, pPage
33230 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44  r->pageSize, &pD
33240 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20  ata.      );..  
33250 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33260 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29  TE_OK && pData )
33270 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
33280 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
33290 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20  ER_READER ){.   
332a0 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
332b0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
332c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
332d0 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
332e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
332f0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
33300 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33310 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
33320 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
33330 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
33340 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33350 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33360 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
33370 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
33380 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
33390 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
333a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
333b0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
333c0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
333d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
333e0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
333f0 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20  = pPg;.         
33400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33410 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
33420 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
33430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33440 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
33450 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
33460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
33470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33480 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
33490 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
334a0 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  , 1, ppPage);.  
334b0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
334c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
334d0 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
334e0 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
334f0 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
33500 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
33510 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
33520 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
33530 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
33540 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
33550 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
33560 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
33570 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
33580 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
33590 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
335a0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
335b0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
335c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
335d0 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
335e0 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
335f0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
33600 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28  ger==pPager || (
33610 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
33620 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a  ==0 );..  if( (*
33630 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20  ppPage)->pPager 
33640 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
33650 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
33660 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
33670 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
33680 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
33690 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
336a0 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
336b0 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
336c0 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
336d0 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
336e0 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
336f0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
33700 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
33710 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
33720 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b  GER_STAT_HIT]++;
33730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33740 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
33750 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
33760 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
33770 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
33780 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
33790 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
337a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
337b0 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50  ..    pPg = *ppP
337c0 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  age;.    pPg->pP
337d0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
337e0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
337f0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
33800 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
33810 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
33820 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e   a page.    ** n
33830 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
33840 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20  an this, or the 
33850 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70  unused locking-p
33860 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65  age, is requeste
33870 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  d. */.    if( pg
33880 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
33890 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
338a0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
338b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
338c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
338d0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
338e0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
338f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
33900 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72   MEMDB || pPager
33910 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
33920 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69   noContent || !i
33930 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
33940 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
33950 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
33960 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
33970 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
33980 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
33990 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
339a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
339b0 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
339c0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
339d0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
339e0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
339f0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
33a00 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
33a10 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
33a20 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
33a30 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
33a40 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
33a50 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
33a60 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
33a70 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
33a80 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
33a90 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
33aa0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
33ab0 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
33ac0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
33ad0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
33ae0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
33af0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
33b00 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
33b10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33b20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
33b30 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
33b40 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
33b50 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
33b60 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
33b70 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
33b80 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
33b90 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
33ba0 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
33bb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
33bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
33bd0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
33be0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
33bf0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
33c00 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
33c10 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
33c20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
33c30 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
33c40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
33c50 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
33c60 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
33c70 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
33c80 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
33c90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
33ca0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
33cb0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
33cc0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
33cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
33ce0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33cf0 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d  er) && bMmapOk==
33d00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
33d10 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
33d20 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
33d30 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
33d40 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
33d50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
33d60 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
33d70 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
33d80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
33d90 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
33da0 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  r );.      pPage
33db0 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
33dc0 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20  TAT_MISS]++;.   
33dd0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
33de0 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b  ge(pPg, iFrame);
33df0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
33e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33e10 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
33e20 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
33e30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
33e40 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
33e50 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
33e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33e70 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65  .pager_acquire_e
33e80 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63  rr:.  assert( rc
33e90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
33ea0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
33eb0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
33ec0 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  p(pPg);.  }.  pa
33ed0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
33ee0 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70  d(pPager);..  *p
33ef0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
33f00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33f10 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
33f20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
33f30 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
33f40 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
33f50 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
33f60 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
33f70 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
33f80 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
33f90 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
33fa0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
33fb0 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f   .**.** See also
33fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33fd0 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
33fe0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
33ff0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
34000 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
34010 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
34020 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
34030 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
34040 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
34050 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
34060 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
34070 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
34080 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
34090 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
340a0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
340b0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
340c0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
340d0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
340e0 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
340f0 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
34100 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
34110 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
34120 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
34130 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
34140 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
34150 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34160 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
34170 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34180 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
34190 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
341a0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
341b0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c 69  _ERROR );.  sqli
341c0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
341d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
341e0 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
341f0 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
34200 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
34210 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
34220 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
34230 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
34240 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
34250 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
34260 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
34270 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
34280 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
34290 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
342a0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
342b0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
342c0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
342d0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
342e0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
342f0 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
34300 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34310 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
34320 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
34330 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
34340 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
34350 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
34360 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29  s & PGHDR_MMAP )
34370 7b 0a 20 20 20 20 20 20 70 61 67 65 72 52 65 6c  {.      pagerRel
34380 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29  easeMapPage(pPg)
34390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
343a0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
343b0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
343c0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
343d0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
343e0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
343f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
34400 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
34410 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
34420 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
34430 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
34440 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
34450 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
34460 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
34470 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
34480 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
34490 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
344a0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
344b0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
344c0 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
344d0 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
344e0 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
344f0 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
34500 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
34510 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
34520 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
34530 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
34540 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34550 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
34560 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34570 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
34580 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
34590 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
345a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
345b0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
345c0 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
345d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
345e0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
345f0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
34600 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
34610 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
34620 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
34630 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
34640 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
34650 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
34660 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
34670 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
34680 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
34690 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
346a0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
346b0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
346c0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
346d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
346e0 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
346f0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
34700 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
34710 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
34720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
34730 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
34740 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
34750 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
34760 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
34770 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
34780 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
34790 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
347a0 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
347b0 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
347c0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
347d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
347e0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
347f0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
34800 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
34810 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
34820 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34840 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
34850 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
34860 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
34870 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
34880 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
34890 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
348a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
348b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
348c0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
348d0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
348e0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
348f0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
34900 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34910 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
34920 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
34930 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
34940 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
34950 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
34960 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
34970 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
34980 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
34990 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
349a0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
349b0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
349c0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
349d0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
349e0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
349f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
34a00 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
34a10 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
34a20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
34a30 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
34a40 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
34a50 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
34a60 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
34a70 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
34a80 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
34a90 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
34aa0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
34ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34ac0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a  NOMEM;.    }.  .
34ad0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
34ae0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
34af0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
34b00 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69  y open. */.    i
34b10 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
34b20 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
34b30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
34b40 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
34b50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
34b60 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  RY ){.        sq
34b70 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
34b80 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
34b90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34ba0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
34bb0 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
34bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
34bd0 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
34be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
34bf0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
34c00 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
34c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
34c20 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70  TE|.          (p
34c30 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
34c40 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ? .            (
34c50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
34c60 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
34c70 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
34c80 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  AL):.           
34c90 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
34ca0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
34cb0 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65        );.  #ifde
34cc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
34cd0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
34ce0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34cf0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
34d00 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
34d10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
34d20 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
34d30 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
34d40 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
34d50 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a       );.  #else.
34d60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34d70 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
34d80 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
34d90 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
34da0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e  flags, 0);.  #en
34db0 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
34dc0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
34dd0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
34de0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
34df0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
34e00 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
34e10 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
34e20 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
34e30 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
34e40 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
34e50 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
34e60 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
34e70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
34e90 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
34ea0 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
34eb0 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
34ec0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
34ed0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
34ee0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
34ef0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
34f00 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
34f10 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
34f20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
34f30 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
34f40 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
34f50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
34f60 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
34f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
34f80 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
34f90 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
34fa0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
34fb0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
34fc0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
34fd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34fe0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
34ff0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
35000 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
35010 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
35020 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
35030 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
35040 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
35050 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
35060 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
35070 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
35080 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
35090 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
350a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
350b0 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
350c0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
350d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
350e0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
350f0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
35100 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
35110 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
35120 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
35130 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
35140 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
35150 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
35160 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
35170 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
35180 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
35190 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
351a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
351b0 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
351c0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
351d0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
351e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
351f0 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
35200 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
35210 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
35220 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
35230 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
35240 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
35250 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
35260 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
35270 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
35280 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
35290 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
352a0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
352b0 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
352c0 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
352d0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
352e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
352f0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
35300 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
35310 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
35320 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
35330 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
35340 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
35350 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
35360 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
35370 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
35380 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
35390 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
353a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
353b0 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
353c0 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
353d0 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
353e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
353f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
35400 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
35410 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
35420 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
35430 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35440 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
35450 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
35460 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
35470 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
35480 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
35490 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
354a0 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
354b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
354c0 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
354d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
354e0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
354f0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
35500 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
35510 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
35520 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
35530 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
35540 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
35550 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
35560 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
35570 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
35580 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
35590 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
355a0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
355b0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
355c0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
355d0 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
355e0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
355f0 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
35600 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
35610 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
35620 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
35630 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
35640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
35660 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
35670 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45       sqlite3WalE
35680 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
35690 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
356a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
356b0 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
356c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
356d0 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
356e0 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
356f0 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
35700 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
35710 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
35720 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
35730 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
35740 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
35750 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
35760 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
35770 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
35780 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
35790 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
357a0 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
357b0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
357c0 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20   will call it.. 
357d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
357e0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
357f0 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
35800 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
35810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35820 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
35830 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
35840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35850 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
35860 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
35870 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
35880 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
35890 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
358a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
358b0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
358c0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
358d0 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
358e0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
358f0 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
35900 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
35910 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
35920 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
35930 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
35940 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
35950 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
35960 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
35970 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
35980 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
35990 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
359a0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
359b0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
359c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
359d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
359e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
359f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
35a00 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52  Change to WRITER
35a10 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20  _LOCKED state.. 
35a20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
35a30 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50   WAL mode sets P
35a40 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50  ager.eState to P
35a50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
35a60 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20  ED or CACHEMOD. 
35a70 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20       ** when it 
35a80 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  has an open tran
35a90 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
35aa0 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46  er to DBMOD or F
35ab0 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a  INISHED..      *
35ac0 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
35ad0 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65  e in those state
35ae0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  s the code to ro
35af0 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
35b00 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
35b10 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70  sactions may cop
35b20 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  y data from the 
35b30 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f  sub-journal into
35b40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
35b50 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
35b60 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65  well as into the
35b70 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
35b80 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
35b90 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20  rrect in .      
35ba0 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20  ** WAL mode..   
35bb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
35bc0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
35bd0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
35be0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35bf0 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
35c00 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
35c10 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
35c20 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
35c30 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
35c40 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
35c50 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
35c60 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
35c70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
35c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
35c90 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
35ca0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
35cb0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
35cc0 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
35cd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
35ce0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
35cf0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
35d00 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
35d10 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
35d20 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35d30 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
35d40 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
35d50 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
35d60 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
35d70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35d80 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
35d90 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
35da0 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
35db0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
35dc0 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
35dd0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
35de0 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
35df0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
35e00 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
35e10 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
35e20 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
35e30 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
35e40 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
35e50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
35e60 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
35e70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
35e80 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
35e90 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
35ea0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
35eb0 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
35ec0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
35ed0 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
35ee0 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
35ef0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
35f00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
35f10 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
35f20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35f30 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
35f40 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
35f50 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
35f60 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
35f70 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
35f80 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
35f90 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
35fa0 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
35fb0 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
35fc0 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
35fd0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
35fe0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
35ff0 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
36000 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36010 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36020 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
36030 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36040 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
36050 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
36060 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36070 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
36080 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
36090 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
360a0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
360b0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
360c0 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76  or has been prev
360d0 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c  iously detected,
360e0 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65   report the same
360f0 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69   error.  ** agai
36100 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  n. This should n
36110 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74  ot happen, but t
36120 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65  he check provide
36130 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  s robustness. */
36140 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
36150 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
36160 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
36170 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
36180 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
36190 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
361a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
361b0 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
361c0 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
361d0 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
361e0 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
361f0 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
36200 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
36210 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
36220 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
36230 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
36240 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
36250 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
36260 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
36270 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
36280 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
36290 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
362a0 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
362b0 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
362c0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
362d0 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
362e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
362f0 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
36300 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
36310 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
36320 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
36330 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
36340 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
36350 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
36360 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
36370 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
36380 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
36390 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
363a0 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
363b0 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
363c0 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
363d0 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
363e0 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
363f0 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
36400 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
36410 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
36420 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
36430 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
36440 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
36450 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36460 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
36470 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
36480 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
36490 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
364a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
364b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
364c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
364d0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
364e0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
364f0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
36500 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
36510 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
36520 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
36530 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
36540 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
36550 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
36560 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
36570 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
36580 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
36590 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
365a0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
365b0 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
365c0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
365d0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
365e0 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
365f0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
36600 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c  pPager) );.  }el
36610 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68  se{.  .    /* Th
36620 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
36630 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
36640 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
36650 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
36660 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
36670 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
36680 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
36690 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
366a0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
366b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
366c0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
366d0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
366e0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
366f0 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
36700 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65  al(pPg) && !page
36710 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
36720 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
36730 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
36740 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ger)==0 );.     
36750 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
36760 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
36770 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  ze && isOpen(pPa
36780 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
36790 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
367a0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
367b0 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36  ata2;.        i6
367c0 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
367d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
367e0 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
367f0 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
36800 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
36810 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
36820 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
36830 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
36840 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
36850 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
36860 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
36870 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
36880 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
36890 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
368a0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
368b0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20  Pager) );..     
368c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
368d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
368e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
368f0 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  f );.        COD
36900 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
36910 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
36920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36930 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
36940 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
36950 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
36960 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
36970 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
36980 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
36990 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
369a0 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  urs while journa
369b0 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
369c0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
369d0 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
369e0 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
369f0 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
36a00 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
36a10 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
36a20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
36a30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
36a40 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
36a50 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
36a60 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
36a70 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
36a80 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
36a90 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
36aa0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
36ab0 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
36ac0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
36ad0 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
36ae0 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
36af0 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
36b00 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
36b10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67    */.        pPg
36b20 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
36b30 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20  _NEED_SYNC;..   
36b40 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
36b50 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
36b60 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67  d, iOff, pPg->pg
36b70 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
36b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36b90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36ba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36bb0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
36bc0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
36bd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
36be0 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  Off+4);.        
36bf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
36c00 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
36c10 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
36c20 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
36c30 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
36c40 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
36c50 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sum);.        if
36c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36c70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
36c80 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
36c90 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
36ca0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
36cb0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
36cc0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
36cd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
36ce0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
36cf0 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
36d00 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
36d10 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
36d20 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
36d30 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c  RTRACE(("JOURNAL
36d40 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
36d50 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
36d60 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
36d70 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
36d80 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
36d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
36da0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
36db0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
36dc0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
36dd0 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20  (pPg)));..      
36de0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
36df0 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
36e00 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
36e10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
36e20 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
36e30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
36e40 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
36e50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36e60 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
36e70 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
36e80 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
36e90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
36ea0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
36eb0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
36ec0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
36ed0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
36ee0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
36ef0 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
36f00 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
36f10 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
36f20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
36f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36f40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
36f50 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
36f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
36f70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
36f80 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
36f90 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
36fa0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
36fb0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
36fc0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
36fd0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
36fe0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
36ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
37000 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
37010 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
37020 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
37030 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
37040 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
37050 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
37060 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
37070 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
37080 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
37090 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
370a0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
370b0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
370c0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
370d0 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
370e0 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
370f0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
37100 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
37110 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
37120 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
37130 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
37140 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
37150 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
37160 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
37170 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
37180 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
37190 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
371a0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
371b0 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
371c0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
371d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
371e0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
371f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
37200 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
37210 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
37220 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
37230 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
37240 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
37250 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
37260 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
37270 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37280 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
37290 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
372a0 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
372b0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
372c0 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
372d0 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
372e0 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
372f0 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
37300 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
37310 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
37320 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
37330 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
37340 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
37350 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
37360 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
37370 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
37380 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
37390 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
373a0 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
373b0 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
373c0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
373d0 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
373e0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
373f0 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
37400 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
37410 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
37420 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
37430 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
37440 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
37450 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
37460 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
37470 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
37480 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
37490 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
374a0 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
374b0 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
374c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
374d0 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
374e0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
374f0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
37500 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
37510 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
37520 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
37530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
37540 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
37550 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
37560 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
37570 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
37580 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
37590 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
375a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
375b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  );..  assert( (p
375c0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
375d0 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 0a 20 20  R_MMAP)==0 );.  
375e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
375f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
37600 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
37610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37620 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
37630 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
37640 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
37650 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
37660 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53  .  if( nPagePerS
37670 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
37680 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
37690 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
376a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
376b0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
376c0 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
376d0 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
376e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
376f0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
37700 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
37710 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
37720 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  age = 0;        
37730 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
37740 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
37750 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
37760 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
37770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37780 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
37790 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  er */.    int ne
377a0 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20  edSync = 0;     
377b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
377c0 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44  ny page has PGHD
377d0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a  R_NEED_SYNC */..
377e0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
377f0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c  oNotSyncSpill fl
37800 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
37810 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
37820 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20  ot allow.    ** 
37830 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
37840 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
37850 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
37860 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20   journaled by.  
37870 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
37880 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
37890 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
378a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
378b0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
378c0 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ill==0 );.    pP
378d0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
378e0 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  pill++;..    /* 
378f0 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
37900 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
37910 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
37920 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
37930 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
37940 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
37950 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
37960 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
37970 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
37980 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
37990 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
379a0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
379b0 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
379c0 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
379d0 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
379e0 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
379f0 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61 67  PageCount = pPag
37a00 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
37a10 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
37a20 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
37a30 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
37a40 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
37a50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
37a60 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
37a70 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
37a80 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
37a90 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
37aa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37ab0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
37ac0 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
37ad0 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
37ae0 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
37af0 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
37b00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
37b10 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
37b20 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
37b30 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
37b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
37b50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
37b60 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
37b70 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
37b80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
37b90 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
37ba0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
37bb0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37bc0 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
37bd0 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
37be0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
37bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
37c00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
37c10 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
37c20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
37c30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
37c50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
37c60 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
37c70 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
37c80 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
37c90 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
37ca0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
37cb0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
37cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
37cd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
37ce0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
37cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37d00 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
37d10 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
37d20 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
37d30 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
37d40 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
37d50 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
37d60 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
37d70 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
37d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37d90 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37da0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
37db0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
37dc0 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45   If the PGHDR_NE
37dd0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
37de0 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
37df0 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
37e00 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
37e10 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
37e20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
37e30 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
37e40 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
37e50 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
37e60 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
37e70 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
37e80 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
37e90 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
37ea0 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
37eb0 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
37ec0 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
37ed0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
37ee0 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
37ef0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
37f00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37f10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37f20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
37f30 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  & needSync ){.  
37f40 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
37f50 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  DB );.      for(
37f60 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20  ii=0; ii<nPage; 
37f70 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
37f80 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
37f90 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
37fa0 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
37fb0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
37fc0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
37fd0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
37fe0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
37ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
38000 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
38010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38020 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
38030 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
38040 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20 29  otSyncSpill==1 )
38050 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
38060 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a  NotSyncSpill--;.
38070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
38080 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
38090 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
380a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
380b0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
380c0 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
380d0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
380e0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
380f0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
38100 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
38110 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
38120 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
38130 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
38140 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
38150 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
38160 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
38170 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
38180 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
38190 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
381a0 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
381b0 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
381c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
381d0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
381e0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
381f0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
38200 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
38210 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
38220 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
38230 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
38240 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
38250 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
38260 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
38270 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
38280 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
38290 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
382a0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
382b0 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
382c0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
382d0 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
382e0 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
382f0 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
38300 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
38310 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
38320 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
38330 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
38340 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
38350 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
38360 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61  ed. The pager ma
38370 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
38380 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
38390 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
383a0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
383b0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
383c0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
383d0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75  imization can qu
383e0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
383f0 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44  d of large .** D
38400 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
38410 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
38420 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
38430 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
38440 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
38450 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
38460 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
38470 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50  HDR_DIRTY) && pP
38480 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
38490 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52  ==0 ){.    PAGER
384a0 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
384b0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
384c0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
384d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
384e0 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
384f0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
38500 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
38510 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c  no)).    pPg->fl
38520 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
38530 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70 61 67  T_WRITE;.    pag
38540 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
38550 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pPg);.  }.}../*.
38560 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
38570 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
38580 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
38590 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
385a0 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65   file .** change
385b0 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64  -counter, stored
385c0 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67   as a 4-byte big
385d0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
385e0 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20  starting at .** 
385f0 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f  byte offset 24 o
38600 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
38610 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61 72 79  .  The secondary
38620 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
38630 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c 73 6f  at.** 92 is also
38640 20 75